获取目录中所有文件的名称列表 (Perl)

Get list of names of all files in a directory (Perl)

获取给定目录(包括子目录中的文件)中所有文件的全名列表的最简单方法是什么?

是的,我知道 File::Find 模块。但是有没有更简单的方法呢?

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 仅使其不是 return 目录,同时它仍然递归。有很多这样的 "rules" 可以微调行为。我确实发现它在某些情况下的性能较慢。见文末link。

核心 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 也很好,"lazily" 走树

perl -Mstrict -MPath::Tiny -wE' my $dir = shift // ".";
    my $iter = path($dir)->iterator({recurse => 1}); 
    while (my $path = $iter->()) { say $path }'

在这里您可以通过多种方式方便地查询遇到的内容。该模块还有许多其他工具并用于文件系统工作,这几乎是一个 "side" 功能。

同样来自 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

可以使用很多 方便的方法设置规则,还包括用于逻辑、文件内容查询、自定义规则等的方法。

查看 performance comparison 文件查找器的选择(自 2013 年起)。