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
我的 $dh = opendir(".");
我的@entries = grep !/^\.\.?$/, readdir($dh);
关闭$dh;

foreach 我的 $entry (@entries) {
    如果(-f $entry){
        # $entry 是一个文件
    } elsif (-d $entry) {
        # $entry 是一个目录
    }
}
于 2008-10-15T20:37:21.650 回答
5
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
于 2008-10-21T19:51:52.143 回答
2

它会更容易使用File::Find

于 2008-10-15T20:37:35.363 回答