获取目录中所有文件的名称列表 (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 年起)。
获取给定目录(包括子目录中的文件)中所有文件的全名列表的最简单方法是什么?
是的,我知道 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 年起)。