如何扫描整个目录的内容,包括其子目录的内容,并找到最新的 .pl
使用 Perl 在其中的文件?
我想构建所有.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]
中执行该文件,不会有问题。
有一个similar关于 SO 的问题,我一直在尝试修改以满足我的需要,但出于明显的原因,我现在在这里。
我用来在一个目录中获取最新文件 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;
关于perl - 如何使用 Perl 在目录及其所有子目录中找到最新的 .pl 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585145/