0

私は非常にperlの初心者なので、我慢してください。

OS X でフォルダーを再帰する方法を探していたところ、この解決策に出会いました:ディレクトリ内のすべてのファイルをトラバースする方法...

引数で検索フォルダーを指定できるように、perreal の回答 (以下のコードを参照) を少し変更しました。つまり、私はmy @dirs = (".");私の@dirs = ($ARGV[0]);

しかし、何らかの理由でこれは機能しません。フォルダーを開きますが、「。」を除いて、サブディレクトリをフォルダーとして識別しません。および '..' であるため、指定されたルートを実際に超えたことはありません。

フォルダ (例: \Volumes\foo\bar) を積極的に指定しても、まだ機能しません。しかし、目的のフォルダー (foo\bar) に戻ってmy @dirs = (".");座って、独自のフォルダー (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、ファイルbasenameでパスなしで演算子を使用していることです。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 に答える