获取给定目录中所有文件的全名列表(包括子目录中的文件)的最简单方法是什么?
是的,我知道File::Find
模块。但是有更简单的方法吗?
答案 0 :(得分:5)
File::Find::Rule是一个非常有用的工具
perl -Mstrict -MFile::Find::Rule -wE'
my @files = File::Find::Rule->file->in(".");
say for @files
'
您可以先获取对象my $ffr = File::Find::Rule
,然后在其上设置规则。规则->file
仅使它不返回目录,而它仍然是递归的。有许多这样的“规则”来微调行为。在某些情况下我确实发现它的性能较慢。见最后的链接。
核心File::Find完成了上面的包装所做的所有工作,也许还需要更多的工作
perl -Mstrict -MFile::Find -wE' my @dirs = (@ARGV ? @ARGV : ".");
my @files;
find( sub { push @files, $File::Find::name if -f }, @dirs );
say for @files;
' dir1 dir2 ... (or pass nothing, to scan ".")
仅-f
filetest收集常规文件。我添加了一个如何(可选)传递目录列表以在单行中扫描的示例。据我所知,它仍然是表现最佳的模块。在某些用途中,它可以快得多。
Path::Tiny->iterator非常好,因为“懒洋洋地”走树[/ p>]
perl -Mstrict -MPath::Tiny -wE' my $dir = shift // ".";
my $iter = path($dir)->iterator({recurse => 1});
while (my $path = $iter->()) { say $path }
'
您可以通过多种方式方便地查询遇到的内容。该模块有许多其他工具和用于文件系统工作,这几乎是一个“侧面”功能。
同样来自Path::Tiny
的作者的Path::Iterator::Rule也提供了延迟迭代,但它是一个完整的专用迭代器,界面类似于File::Find::Rule
perl -Mstrict -MPath::Iterator::Rule -wE'
my $dir = shift // ".";
my $rule = Path::Iterator::Rule->new->not_dir->not_empty;
my $next = $rule->iter($dir);
while (my $file = $next->()) { say $file }
' dirname
可以使用方便方法 lot 设置规则,还包括逻辑方法,文件内容查询,自定义编写规则等。
查看performance comparison选择的文件查找器(自2013年起)。