20

Perl で現在のディレクトリのすべてのサブディレクトリをトラバースし、それらのファイルからデータを取得しようとしています。指定されたディレクトリ内のすべてのファイルとフォルダーのリストを取得するために grep を使用していますが、返される値のどれがフォルダー名で、どれがファイル拡張子のないファイルかわかりません。

どうすれば違いがわかりますか?

4

6 に答える 6

32

-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);
于 2008-10-15T20:47:09.883 に答える
21
print "$file is a directory\n" if ( -d $file );
于 2008-10-15T20:35:07.740 に答える
10

-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

http://metacpan.org/pod/File::Nextにあります

于 2008-10-15T20:39:09.960 に答える
5
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
于 2008-10-21T19:51:52.143 に答える
5
私の $dh = opendir(".");
私の @entries = grep !/^\.\.?$/, readdir($dh);
closedir $dh;

foreach 私の $entry (@entries) {
    if(-f $entry) {
        # $entry はファイルです
    } elsif (-d $entry) {
        # $entry はディレクトリ
    }
}
于 2008-10-15T20:37:21.650 に答える
2

使いやすくなりますFile::Find

于 2008-10-15T20:37:35.363 に答える