2014-05-21 31 views
3

注意:相關問題通過使用不推薦使用的模塊解決,並且在OS之間不一致。當前問題的答案使用較新的模塊,因此將在此處發佈。Perl以遞歸方式複製特定格式的文件

我有一個模塊,反過來使用File::NCopy CPAN模塊從文件遞歸複製到。

問題是 - 我需要遞歸複製特定文件類型的文件到目的地。有什麼方法可以通過擴展來過濾源代碼?

作爲替代 - 有沒有辦法複製除隱藏文件以外的所有文件?我的主要問題是.git文件夾也被複制 - 這是不希望的。

平臺:MacOS的

替代探索:

1)文件::複製::遞歸模塊: - 似乎提供文件或目錄的唯一遞歸複製。似乎無法幫助隱藏文件或排除過濾器

2)使用rsync -avz --exclude =「。*」: - 無法將其與遞歸複製功能結合使用。

3)與How can I copy a directory recursively and filter filenames in Perl?類似的自主開發的解決方案: - 可能是最後的手段 - 但似乎不移植,除非在不同平臺上進行了調整和測試。 除非模塊已經存在,否則會回落到此。

4)https://metacpan.org/pod/Path::Class::Dir: - 似乎似乎 - 將運行一個快速實施使用此。

實施的解決方案:

我用遞歸模塊和路徑::類::迪爾

dir($sourceDir)->recurse(callback => sub { 
    my $file = shift; 

    return if($file eq '.' || $file eq '..'); 

    return if -d $file; 

    if (<custom filter>) 
    { 
     my $path = file($file)->relative($sourceDir); 
     fcopy("$sourceDir/$path", "$destinationDir/$path") or die "Could not perform fcopy: $!"; 
    } 
}); 

沒有相對路徑 - 目標文件夾結構似乎並不相同作爲源文件夾結構。

+2

小記:['文件:: NCopy'(https://metacpan.org/pod/File::NCopy)報告說,它已被棄用,建議使用['文件::複製:: Recursive']( https://metacpan.org/pod/File::Copy::Recursive)。 – Miller

+0

什麼操作系統? – ooga

+0

如果您想排除點文件AFAIK,則可能必須製作本地解決方案。 – squiguy

回答

1

我認爲最簡單的解決方案是使用File::Copy::Recursive完全複製目錄結構,然後返回File::Find::Rule以確定您要過濾並刪除它們的所有目錄。

鑑於.git文件夾不一定持有如此多的數據,我想表現的命中從複製的文件超過你需要的可能是非常小的。下面將足以實現你的願望:

use strict; 
use warnings; 

use File::Copy::Recursive qw(dircopy pathrmdir); 
use File::Find::Rule; 

my $src = '...src...'; 
my $dest = '...dest...'; 

dircopy($src, $dest) or die "Can't dircopy: $!"; 

my @git = File::Find::Rule->directory() 
          ->name('.git') 
          ->in($dest); 

pathrmdir($_) or die "Can't remove $_: $!" for (@git); 

另外,如果你想推出自己的,你可以看看File::Find::Rule #Further Examples,其中包括關於如何「忽略CVS目錄」的一個例子。

相關問題