在Perl中有一个优雅的方式来找到目录中的最新文件(最新的修改日期)?
到目前为止,我正在搜索我需要的文件,并为每个文件修改时间,推入一个包含文件名的数组,修改时间,然后排序。
必须有一个更好的方法。
解决方法
你的方式是“正确”的方式,如果你需要排序列表(而不只是第一个,看到布赖恩的答案)。如果您不喜欢自己编写该代码,请使用
this
use File::DirList; my @list = File::DirList::list('.','M');
我个人不会用ls -t方法 – 这涉及到划分另一个程序,它不可移植。几乎我所说的“优雅”!
关于rjray的解决办法,我稍稍改变一下:
opendir(my $DH,$DIR) or die "Error opening $DIR: $!"; my @files = map { [ stat "$DIR/$_",$_ ] } grep(! /^\.\.?$/,readdir($DH)); closedir($DH); sub rev_by_date { $b->[9] <=> $a->[9] } my @sorted_files = sort rev_by_date @files;
此后,@sorted_files包含排序列表,其中第0个元素是最新文件,每个元素本身包含对stat结果的引用,文件名本身在最后一个元素中:
my @newest = @{$sorted_files[0]}; my $name = pop(@newest);
这样做的优点是,如果需要,稍后更改排序方法更容易。
编辑:这是一个更容易阅读(但更长)的目录扫描版本,这也确保只有普通的文件被添加到列表中:
my @files; opendir(my $DH,$DIR) or die "Error opening $DIR: $!"; while (defined (my $file = readdir($DH))) { my $path = $DIR . '/' . $file; next unless (-f $path); # ignore non-files - automatically does . and .. push(@files,[ stat(_),$path ]); # re-uses the stat results from '-f' } closedir($DH);
注意:对readdir()的结果的定义()的测试是因为一个名为’0’的文件会导致循环失败,如果你只测试if(my $ file = readdir($ DH))