如何複製包含子目錄的目錄(不包括與Windows系統上的某個正則表達式匹配的文件或目錄)?如何遞歸複製目錄並在Perl中過濾文件名?
12
A
回答
11
我會做這樣的事情:
use File::Copy;
sub copy_recursively {
my ($from_dir, $to_dir, $regex) = @_;
opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
for my $entry (readdir $dh) {
next if $entry =~ /$regex/;
my $source = "$from_dir/$entry";
my $destination = "$to_dir/$entry";
if (-d $source) {
mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
copy_recursively($source, $destination, $regex);
} else {
copy($source, $destination) or die "copy failed: $!";
}
}
closedir $dh;
return;
}
1
我不知道該怎麼做一個副本的排斥,但你可以再商量了沿着線:
ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh
5
如果你碰巧是一個類Unix操作系統,並獲得到rsync (1)
,你應該使用它(例如通過system()
)。
Perl的File :: Copy有點壞(例如,它不會在Unix系統上覆制權限),所以如果您不想使用系統工具,請查看CPAN。也許File::Copy::Recursive可能是有用的,但我沒有看到任何排除選項。我希望別人有更好的主意。
9
另一種選擇是File :: Xcopy。顧名思義,它或多或少地模擬了windows xcopy命令,包括其過濾和遞歸選項。
從文檔:
use File::Xcopy;
my $fx = new File::Xcopy;
$fx->from_dir("/from/dir");
$fx->to_dir("/to/dir");
$fx->fn_pat('(\.pl|\.txt)$'); # files with pl & txt extensions
$fx->param('s',1); # search recursively to sub dirs
$fx->param('verbose',1); # search recursively to sub dirs
$fx->param('log_file','/my/log/file.log');
my ($sr, $rr) = $fx->get_stat;
$fx->xcopy; # or
$fx->execute('copy');
# the same with short name
$fx->xcp("from_dir", "to_dir", "file_name_pattern");
1
一個經典的答案會用 'cpio -p
':
(cd $SOURCE_DIR; find . -type f -print) |
perl -ne 'print unless m/<regex-goes-here>/' |
cpio -pd $TARGET_DIR
的' cpio
' 命令與實際複製交易,包括允許保存。 「cd $SOURCE_DIR; find . ...
」的技巧涉及從名稱中刪除源路徑的前導部分。調用'find
'的唯一問題是它不會遵循符號鏈接;如果這是你想要的,你需要添加'-follow
'。
+0
確實在Windows的工作嗎? – Manu 2008-10-22 22:22:13
相關問題
- 1. 在Python中跳過一些目錄遞歸複製文件?
- 2. 迭代(或遞歸?)過濾目錄並將結果複製到新目錄
- 3. 如何在使用scp遞歸複製dir時過濾文件?
- 4. 如何遞歸複製特定的文件,並保持父目錄的名稱
- 5. 通過目錄遞歸併根據父目錄重命名/附加文件名
- 6. 使用目錄名稱上的過濾器遞歸刪除文件和目錄
- 7. Ansible遞歸目錄複製
- 8. 在tcl中遞歸複製目錄
- 9. 如何通過文件類型遞歸查找文件並將它們複製到ssh中的目錄中?
- 10. 在Python中遞歸複製文件或目錄
- 11. Perl:遞歸重命名所有文件和目錄
- 12. 列出文件遞歸地目錄名
- 13. 從目錄樹中遞歸複製文件類型
- 14. 如何在TFS Team Build中複製遞歸目錄結構?
- 15. 如何複製一個目錄並遞歸地忽略某個目錄?
- 16. 如何遞歸複製目錄內容並排除源目錄本身?
- 17. 使用Perl遞歸地從Ftp服務器複製目錄
- 18. 如何include目錄遞歸NuSpec文件
- 19. 複製目錄中的文件並更改文件名
- 20. 如何將所有文件遞歸複製到Ruby中的平面目錄?
- 21. 在node.js中遞歸複製文件夾
- 22. perl中的遞歸目錄遍歷
- 23. Python:遞歸複製一批目錄
- 24. PHP FTP複製目錄遞歸
- 25. 如何遞歸地將目錄複製到另一個目錄並只替換未更改的文件?
- 26. 在Perl中通過目錄遞歸時使用ARGV
- 27. C - 遞歸複製文件
- 28. 遞歸複製文件
- 29. Perl從遞歸目錄中打開文件
- 30. 從perl中的目錄遞歸地刪除文件
我認爲你有一個問題(無限循環),如果你的$ regexp不匹配「。」或「..」,它們是readdir返回的$ entry的前兩個值。 如果你的$ to_dir不存在,並且$ source確實是一個目錄,mkdir將會失敗,我建議使用mkpath來代替。 – huitseeker 2009-08-12 19:30:23