Perl で現在のディレクトリのすべてのサブディレクトリをトラバースし、それらのファイルからデータを取得しようとしています。指定されたディレクトリ内のすべてのファイルとフォルダーのリストを取得するために grep を使用していますが、返される値のどれがフォルダー名で、どれがファイル拡張子のないファイルかわかりません。
どうすれば違いがわかりますか?
-dファイルテスト演算子を使用して、何かがディレクトリであるかどうかを確認できます。一般的に役立つファイルテスト演算子のいくつかを次に示します
-eファイルが存在します。 -zファイルのサイズはゼロです(空です)。 -sファイルのサイズがゼロ以外です(サイズをバイト単位で返します)。 -fファイルはプレーンファイルです。 -dファイルはディレクトリです。 -lファイルはシンボリックリンクです。
詳細については、perlfuncのマニュアルページを参照してください。
また、ディレクトリを再帰できるFile::Findを使用してみてください。これがディレクトリを探すサンプルです。
sub wanted {
if (-d) {
print $File::Find::name." is a directory\n";
}
}
find(\&wanted, $mydir);
print "$file is a directory\n" if ( -d $file );
-X演算子を見てください。
perldoc -f -X
ディレクトリトラバーサルには、File :: Findを使用するか、マゾヒストでない場合は、イテレータを作成し、クレイジーなコールバックを必要としない私のFile::Nextモジュールを使用します。実際、File :: Nextはファイルのみを返し、ディレクトリは無視することができます。
use File::Next;
my $iterator = File::Next::files( '/tmp' );
while ( defined ( my $file = $iterator->() ) ) {
print $file, "\n";
}
# Prints...
/tmp/foo.txt
/tmp/bar.pl
/tmp/baz/1
/tmp/baz/2.txt
/tmp/baz/wango/tango/purple.txt
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
私の $dh = opendir("."); 私の @entries = grep !/^\.\.?$/, readdir($dh); closedir $dh; foreach 私の $entry (@entries) { if(-f $entry) { # $entry はファイルです } elsif (-d $entry) { # $entry はディレクトリ } }
使いやすくなりますFile::Find
。