2011-09-28 52 views
4

我怎么能扫描整个目录的内容,包括它的子目录中的内容,并找到在其中最新.pl文件使用Perl?我怎样才能找到一个目录,并使用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的问题,但现在我在这里的原因很明显。

我使用,以获得最新的文件名称只在一个目录中的代码是:

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"; 

回答

12

您可以使用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; 

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

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

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

我想你误解的问题的东西....我正在寻找最新的文件,而不是最大的文件 – CheeseConQueso

+0

@ CheeseConQueso oops!稍后会更新。虽然同样的想法适用! – hobbs

+0

谢谢 - 现在测试 – CheeseConQueso

4

使用File::Find::RuleSchwartzian transform,您可以从dir_path开始的子树中获取带有.pl扩展名的最新文件。

#!/usr/bin/env perl 

use v5.12; 
use strict; 
use File::Find::Rule; 

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

# Note that (stat $_)[ 9 ] yields last modified timestamp 
@files = 
    map { $_->[ 0 ] } 
    sort { $b->[ 1 ] <=> $a->[ 1 ] } 
    map { [ $_, (stat $_)[ 9 ] ] } @files; 

# Here is the newest file in path dir_path 
say $files[ 0 ]; 

地图排序地图链是一个典型的成语:获得时间戳是缓慢的,所以我们做的只有一次每个文件,保持每一个时间戳与其在一个数组引用文件。然后我们使用时间戳(比较每个arrayref的第二个元素)对新列表进行排序,最后我们丢弃时间戳,仅保留文件名。

相关问题