Как проверить наличие подкаталога в 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 со ссылкой на подпрограмму и начальную папку для обработки всех подпапок.