【发布时间】:2010-09-17 09:44:00
【问题描述】:
我正在尝试遍历 Perl 中当前目录的所有子目录,并从这些文件中获取数据。我正在使用 grep 获取给定目录中所有文件和文件夹的列表,但我不知道返回的值中哪个是文件夹名称,哪个是没有文件扩展名的文件。
如何区分?
【问题讨论】:
我正在尝试遍历 Perl 中当前目录的所有子目录,并从这些文件中获取数据。我正在使用 grep 获取给定目录中所有文件和文件夹的列表,但我不知道返回的值中哪个是文件夹名称,哪个是没有文件扩展名的文件。
如何区分?
【问题讨论】:
您可以使用 -d 文件测试运算符来检查某物是否是目录。以下是一些常用的文件测试运算符
-e 文件存在。 -z 文件大小为零(为空)。 -s 文件具有非零大小(以字节为单位返回大小)。 -f 文件是一个普通文件。 -d 文件是一个目录。 -l 文件是符号链接。见perlfunc manual page for more
另外,请尝试使用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;
【讨论】:
使用File::Find会更方便。
【讨论】: