2011-03-11 55 views
31

我有一個目錄~/plugins/和裏面有很多的子目錄。如果我想在abc開始的子目錄的其他地方創建一個備份,我可以使用單行復制命令來完成備份嗎?我會認爲像這樣的工作(但事實並非如此):如何遞歸複製在Linux/Unix上以「abc」開頭的目錄?

 
cp -R ~/plugins/abc* ~/destination/ 

我寧願使用一個行命令,如果可能的話,因爲我也想用rsync的相同的語法,和如果我要像做

 
find ~/plugins/ -type d -name "abc*" -exec cp -R {} ~/destination; 

那麼,對於cp命令工作正常,但那就意味着我將不得不rsync的一次爲每個目錄下運行,並且只是似乎高效:(

+0

爲什麼它不適合你嗎?我測試了它,它工作正常。你需要遞歸遍歷子目錄嗎? – 2011-03-11 16:25:03

回答

51

不知道爲什麼你正在嘗試沒有工作(但什麼是「複製」命令?),不過這在Linux上工作至少:

cp -r ~/plugins/abc* ~/destination 
+1

我在轉換之前使用了dos這麼多年。這就是複製命令。我會再試一次,看看它是否有效:) – cwd 2011-03-16 12:52:01

4

以下是我仍然經常使用的一個老招:

(cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -) 

其中p保留屬性,~/destination可以在任何地方。

+0

+1老學校unix :) – MLH 2013-12-30 03:47:52

1

它可以使用輸出的findrsync

# warning: untested 
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination 
  • -print0find,並--from0rsync可以確保我們處理文件機智^ h空間正確
  • --files-from=-指出,我們正在閱讀的文件列表從標準
+0

這是一個非常酷的把戲! – cwd 2011-03-16 12:52:46

0
#!/usr/bin/env perl 
# copie un fichier avec l'arbo 
# 
# 
use File::Basename; 
use File::Copy; 
my $source = shift; 
my $dest = shift; 
if(!defined $source){ print "Manque fichier source"; exit(0); } 
if(!defined $dest){ print "Manque repertoire dest"; exit(0); } 

my $dir = dirname($source); 
my $file = basename($source); 

my @arbo = split(/\//, $dir); 
my $direct = $dest; 
if(!-d $direct) { mkdir $direct; } 
foreach my $d(@arbo) { 
     $direct.="/".$d; 
     if(!-d $direct) { mkdir $direct; } 
} 
copy($source,$direct); 

名此代碼段例如的CopyFile

進行測試:使用:./copyfile

+0

英語使用者須知:「arbo」顯然是「樹木」(又名「樹木結構」)的簡稱 – 2016-06-30 17:57:11