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