您需要使用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";
}
您好,它從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