如何在Perl中检查子目录?

如何在Perl中检查子目录?,perl,Perl,我有一个名为Client的文件夹,其中包含许多子文件夹。我想创建一个Perl脚本来查看每个子文件夹,并在其中检查文件夹。如果它在那里,我想跳过它并继续,如果它不在那里,我想创建它并进行一些处理 如何循环遍历所有子文件夹并检查所需的目录?我找到了很多关于如何获取文件夹和/或子文件夹中所有文件的信息,但没有找到关于检查每个子文件夹中的目录的信息 简单的答案是使用文件::查找 #!/usr/bin/perl use strict; use Fcntl qw( :DEFAULT :flock :se

我有一个名为Client的文件夹,其中包含许多子文件夹。我想创建一个Perl脚本来查看每个子文件夹,并在其中检查文件夹。如果它在那里,我想跳过它并继续,如果它不在那里,我想创建它并进行一些处理


如何循环遍历所有子文件夹并检查所需的目录?我找到了很多关于如何获取文件夹和/或子文件夹中所有文件的信息,但没有找到关于检查每个子文件夹中的目录的信息

简单的答案是使用文件::查找

#!/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方法,并引用子例程和起始文件夹来处理所有子文件夹。

一旦将其分解为多个步骤,就很容易了。使用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   

啊!其他答案太复杂了。最初的问题似乎不是要求递归遍历。就我所见,这是一个完全合理的解决方案,而且更易于引导:

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?真的吗?

有人忘了使用IO::Handle人们感染了模块病毒,他们忘记了如何编程。至少我不是唯一一个看到这一点的人阿门+1表示KISS解决方案:)尽管如此,我还是倾向于对mkdir的错误消息中没有使用“$!”投反对票:)做得很好;您可以通过将
glob“Client/*”
替换为
grep{-d$\u}“Client/*/”
(后面的
/
)来进行一些优化,以仅匹配开始的目录。需要
grep{-d$}
部分,因为
glob()
还莫名其妙地将符号链接与glob以
/
结尾的文件相匹配(在v5.18.2上观察到)。