File::Find
のドキュメントから少し混乱しています...$ find my_dir -maxdepth 2 -name "*.txt"
と同等のものは何ですか?
個人的には、私は File::Find::Rule
コールバックルーチンを作成する必要がないため。
use strict;
use Data::Dumper;
use File::Find::Rule;
my $dir = shift;
my $level = shift // 2;
my @files = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->in($dir);
print Dumper(\@files);
または、イテレータを作成します。
my $ffr_obj = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->start($dir);
while (my $file = $ffr_obj->match())
{
print "$file\n"
}
私はglob
を使用するだけだと思います。ディレクトリトラバーサルのすべてが本当に必要なわけではないからです。
my @files = glob( '*.txt */*.txt' );
find
に渡すコールバックを簡単に作成できるように File :: Find :: Closures を作成しました:
use File::Find::Closures qw( find_by_regex );
use File::Find qw( find );
my( $wanted, $reporter ) = File::Find::Closures::find_by_regex( qr/\.txt\z/ );
find( $wanted, @dirs );
my @files = $reporter->();
通常、find(1)コマンドをfind2Perl
を使用してPerlプログラムに変換できます(v5.20で削除されましたが、CPANで削除されます)。
% find2Perl my_dir -d 2 -name "*.txt"
しかし、どうやらfind2Perl
は-maxdepth
を理解していないので、それを省略できます。
% find2Perl my_dir -name "*.txt"
#! /usr/local/perls/Perl-5.13.5/bin/Perl5.13.5 -w
eval 'exec /usr/local/perls/Perl-5.13.5/bin/Perl5.13.5 -S $0 ${1+"$@"}'
if 0; #$running_under_some_Shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *Prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*Prune = *File::Find::Prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, 'my_dir');
exit;
sub wanted {
/^.*\.txt\z/s
&& print("$name\n");
}
プログラミングを開始したので、preprocess
ステップを含めてツリーをプルーニングするなど、必要なものをすべてプラグインできます。
use File::Find ;
use Cwd ;
my $currentWorkingDir = getcwd;
my @filesToRun = ();
my $filePattern = '*.cmd' ;
#add only files of type filePattern recursively from the $currentWorkingDir
find( sub { Push @filesToRun, $File::Find::name
if ( m/^(.*)$filePattern$/ ) }, $currentWorkingDir) ;
foreach my $file ( @filesToRun )
{
print "$file\n" ;
}
便利な find2Perl ユーティリティもあります。 Unix findコマンドの代わりに、「find」と同じコマンドライン引数を使用して使用すると、File :: Findを使用する対応するPerlコードが生成されます。
$ find2Perl my_dir -maxdepth 2 -name "*.txt"