2009-10-13 86 views
0

我在我的驅動器中有一個名爲「Lib」的文件夾,裏面包含很多文件,而且我有一個問題,這個「Lib」文件夾存在於驅動器中的許多其他位置。我的Perl腳本必須將內容從文件夾「LIB」這是最新的更新,將其複製並粘貼到文件夾「d:\ Perl的\ Latest_copy_of_Lib」如何與Perl同步兩個目錄?

例如,我有一個lib文件夾中d:\functionsd:\abc,許多其他地方。我想在這些目錄中找到每個文件的最新副本。因此,如果文件d:\functions\foo.txt在2009-10-12上次修改,d:\abc\foo.txt最後在2009-10-13上修改,那麼我希望將d:\abc中的版本複製到目標目錄。

我已經使用file :: find,但它在整個目錄中搜索並複製不是最新副本的內容。

回答

2

您需要使用File::Find來創建要移動的文件的散列。如果文件比已經存儲在散列中的路徑更新,則只將散列路徑放在散列中。這是一個簡單的實現。請注意,在Windows平臺上可能有問題,我不習慣使用File::Spec以跨平臺方式處理文件和路徑。

#!/usr/bin/perl 

use warnings; 
use strict; 

use File::Find; 
use File::Spec; 

my %copy; 

my @sources = qw{ 
    /Users/cowens/foo/Lib 
    /Users/cowens/bar/Lib 
    /Users/cowens/baz/Lib 
}; 

find sub { 
    my ($volume, $dir, $file) = File::Spec->splitpath($File::Find::name); 
    my @dirs     = File::Spec->splitdir($dir); 
    my @base     = ($volume); #the base directory of the file 
    for my $dir (@dirs) { 
     last if $dir eq 'Lib'; 
     push @base, $dir; 
    } 
    #the part that is common among the various bases 
    my @rest = @dirs[$#base .. $#dirs]; 
    my $base = File::Spec->catdir(@base); 
    my $rest = File::Spec->catfile(@rest, $file); 

    #if we don't have this file yet, or if the file is newer than the one 
    #we have 
    if (not exists $copy{$rest} or (stat $File::Find::name)[9] > $copy{$rest}{mtime}) { 
     $copy{$rest} = { 
      mtime => (stat _)[9], 
      base => $base 
     }; 
    } 
}, @sources; 

print "copy\n"; 
for my $rest (sort keys %copy) { 
    print "\t$rest from $copy{$rest}{base}\n"; 
} 
+0

您好,它從Lib中獲取所有內容的副本並將其打印出來。如果在Lib文件夾中發生任何更新,最近只需要單獨使用該副本,則不需要這樣做。比如說如果一個Lib文件夾包含a.txt,那麼我在d:\ abc \ Lib中進行更改。Lib 將b.txt放在該路徑中,它必須在dir中進行搜索,並且僅採用b.txt,因爲我已經刪除了a.txt並在該路徑中單獨替換爲b.txt,而不是在所有路徑中。 – User1611 2009-10-13 13:59:58

9

我想你剛纔描述的rsync。除非你在這裏有一些奇怪的要求,我不認爲你需要編寫任何代碼來做到這一點。我當然不會讓Perl去完成你所描述的工作。

+0

也許他僅限於使用perl來做到這一點?並非每個人都處於同一情況,他們可以立即訪問網絡上的任何開源代碼。 我個人需要完成與rsync相似的任務,但由於過於熱忱的監督,除了perl以外,我無法自由使用任何東西。 – airbear 2014-11-03 02:09:30

+0

看起來很奇怪,有人會相信你要從頭開始,而不是使用一個幾乎無懈可擊的程序,現在可用,而且通常很容易安裝。我認爲這些案例中的許多案例(可能不是你們的案例)缺乏適當的動機來提高管理水平。告訴他們他們會節省多少錢。 :) – 2014-11-03 05:00:45

+0

你有一點,我真的不能同意你更多。話雖如此,一些企業對於自己的行爲儘可能無效且效率低下而堅定不移。 – airbear 2014-11-03 17:38:46

0

如果你能爲你的庫一個位置標準化,然後使用下列之一:

集PERL5LIB環境變量,並

use lib 'C:\Lib'; 

perl -I C:\Lib myscript 

任何這些將給你一個你的lib目錄的副本,任何你的腳本都可以訪問。