加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用Perl在目录及其所有子目录中找到最新的.pl文件?

发布时间:2020-12-15 23:29:19 所属栏目:大数据 来源:网络整理
导读:如何扫描整个目录的内容,包括其子目录的内容,并使用Perl查找其中的最新.pl文件? 我想在目录树中构建所有.pl文件的完整文件路径的排序数组/列表. 因此,例如,如果我的基本目录是/ home / users / cheeseconqueso /我想搜索该目录中的.pl文件以及该路径中的任
如何扫描整个目录的内容,包括其子目录的内容,并使用Perl查找其中的最新.pl文件?

我想在目录树中构建所有.pl文件的完整文件路径的排序数组/列表.

因此,例如,如果我的基本目录是/ home / users / cheeseconqueso /我想搜索该目录中的.pl文件以及该路径中的任何子目录,然后按日期对.pl文件进行排序.

最终的结果是一个数组@pl_paths,其中$pl_paths [0]类似于/home/users/cheeseconqueso/maybe_not_newest_directory/surely_newest_file.pl

从那个结果来看,我想执行该文件,但是我认为一旦我得到排序的数组,在$pl_paths [0]中执行该文件,就不会有问题了.

有一个关于SO的similar问题,我一直在努力修改以满足我的需求,但我现在在这里出于显而易见的原因.

我用来在一个目录中获取最新文件NAME的代码是:

opendir(my $DH,$DIR) or die "Error opening $DIR: $!";
my %files = map { $_ => (stat("$DIR/$_"))[9] } grep(! /^..?$/,readdir($DH));
closedir($DH);
my @sorted_files = sort { $files{$b} <=> $files{$a} } (keys %files);
print $sorted_files[0]."n";

解决方法

如果你想要一个核心模块,你可以使用 File::Find,但我更喜欢使用 File::Find::Rule.

首先,我们可以在目录下找到所有.pl文件

use File::Find::Rule;
my @files = File::Find::Rule->file
                            ->name('*.pl')
                            ->in($directory);

然后让我们使用map将文件名与其修改时间相关联:

my @files_with_mtimes = map +{ name => $_,mtime => (stat $_)[9] },@files;

并按mtime排序:

my @sorted_files = reverse sort { $a->{mtime} <=> $b->{mtime} } 
                @files_with_mtimes;

从那里,最新的名称是$sorted_files [0] {name}.

如果你只想找到最上面的那个,实际上没有必要做一个完整的排序,但我能想到的最好的解决方案涉及一些稍微高级的FP,所以如果你看起来很奇怪,不要担心它:

use List::Util 'reduce';
my ($top_file) = reduce { $a->{mtime} >= $b->{mtime} ? $a : $b } 
  @files_with_mtimes;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读