2011-09-28 47 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的第二個元素)對新列表進行排序,最後我們丟棄時間戳,僅保留文件名。

相關問題