Как проверить наличие подкаталога в Perl?

У меня есть папка с именем Client, которая содержит много подпапок. Я хочу создать Perl-скрипт для просмотра каждой из этих подпапок и проверки наличия там папки. Если он есть, я хочу пропустить его и двигаться дальше, если его там нет, я хочу создать его и выполнить некоторую обработку.

Как мне пройтись по всем подпапкам и проверить каталог, который я хочу? Я нашел много информации о том, как получить все файлы в папке и / или подпапках, но ничего о проверке каталога в каждой подпапке.

4 ответа

Решение

Augh! Слишком много сложностей в других ответах. Оригинальный вопрос, похоже, не требует рекурсивного обхода. Насколько я вижу, это вполне разумное решение, и его гораздо удобнее читать:

foreach my $dir (glob "Client/*") {
    next if ! -d $dir;              # skip if it's not a directory
    next if -d "$dir/subfolder";    # skip if subfolder already exists
    mkdir "$dir/subfolder" or die;  # create it
    do_some_processing();           # do some processing
}

Серьезно, ребята: opendir/readdir? В самом деле?

Это довольно легко, если разбить его на шаги. Получите список подкаталогов с помощью glob, а затем посмотрите, какие из них не имеют каталога второго уровня. Если вы используете модуль File-Find-like, вы, вероятно, делаете слишком много работы:

#!perl

use strict;
use warnings;

use File::Spec::Functions;

my $start  = 'Clients';
my $subdir = 'already_there';

# @queue is the list of directories you need to process
my @queue  = grep { ! -d catfile( $_, $subdir ) }   # filter for the second level
             grep { -d }                            # filter for directories
             glob catfile( $start, '*' );           # everything below $start   
#!/usr/bin/perl

use strict;

use Fcntl qw( :DEFAULT :flock :seek );
use File::Spec;
use IO::Handle;

my $startdir = shift @ARGV || '.';
die "$startdir is not a directory\n"
    unless -d $startdir;
my $verify_dir_name = 'MyDir';

my $dh = new IO::Handle;
opendir $dh, $startdir or
    die "Cannot open $startdir: $!\n";
while(defined(my $cont = readdir($dh))) {
    next
        if $cont eq '.' || $cont eq '..';
    my $fullpath = File::Spec->catfile($dir, $cont);
    next
        unless -d $fullpath && -r $fullpath && -w $fullpath;
    my $verify_path = File::Spec->catfile($fullpath, $verify_dir_name);
    next
        if -d $verify_path;
    mkdir($verify_path, 0755);
    # do whatever other operations you want to $verify_path
}
closedir($dh);

Краткий ответ - использовать File::FInd.

Длинный ответ - сначала написать подпрограмму, которая проверяет существование папки, и, если папка отсутствует, создайте ее, а затем выполните необходимую обработку. Затем вызовите метод find модуля File:: Find со ссылкой на подпрограмму и начальную папку для обработки всех подпапок.

Другие вопросы по тегам