0

我是一个 perl 新手,所以请耐心等待。

我正在寻找一种在 OS X 中递归遍历文件夹的方法,并遇到了这个解决方案:如何遍历目录中的所有文件...

我稍微修改了 perreal 的答案(见下面的代码),以便我可以在参数中指定搜索文件夹;即我改变my @dirs = (".");了我的@dirs = ($ARGV[0]);

但由于某种原因,这不起作用——它会打开文件夹,但不会将任何子目录识别为文件夹,除了“。” 和'..',所以它实际上从未超出指定的根。

如果我主动指定了文件夹(例如 \Volumes\foo\bar),它仍然不起作用。但是,如果我返回my @dirs = (".");然后坐在我想要的文件夹 (foo\bar) 中并从它自己的文件夹 (foo\boo\script.pl) 调用脚本,它就可以正常工作。

这是“预期”的行为吗?我错过了什么?!

非常感谢,

use warnings;
use strict;

my @dirs = (".");
my %seen;
while (my $pwd = shift @dirs) {
        opendir(DIR,"$pwd") or die "Cannot open $pwd\n";
        my @files = readdir(DIR);
        closedir(DIR);
        foreach my $file (@files) {
                if (-d $file and ($file !~ /^\.\.?$/) and !$seen{$file}) {
                        $seen{$file} = 1;
                        push @dirs, "$pwd/$file";
                }
                next if ($file !~ /\.txt$/i);
                my $mtime = (stat("$pwd/$file"))[9];
                print "$pwd $file $mtime";
                print "\n";
        }
}
4

2 回答 2

3

问题是您在-d没有路径的文件基名上使用了运算符。Perl 将在当前工作目录中查找具有该名称的目录,如果在该目录中找到,则返回 true,此时它应该查找$pwd.

此解决方案更改$file为始终保存文件或目录的全名,包括路径。

use strict;
use warnings;

my @dirs = (shift);
my %seen;

while (my $pwd = shift @dirs) {

  opendir DIR, $pwd or die "Cannot open $pwd\n";
  my @files = readdir DIR;
  closedir DIR;

  foreach (@files) {

    next if /^\.\.?$/;

    my $file = "$pwd/$_";
    next if $seen{$file};

    if ( -d $file ) {
      $seen{$file} = 1;
      push @dirs, $file;
    }
    elsif ( $file =~ /\.txt$/i ) {
      my $mtime = (stat $file)[9];
      print "$file $mtime\n";
    }

  }
}
于 2012-11-14T01:10:24.373 回答
0

使用带有 -d 的完整路径

-d "$pwd/$file"
于 2012-11-14T02:42:50.637 回答