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

时间:2017-08-24 22:52:17

标签: perl directory-structure perl5

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

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

1 个答案:

答案 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年起)。