2009-08-21 95 views
55

我想將所有文件從一個名爲Default.png的目錄中複製出來。看來有很多方法可以做到這一點。什麼似乎對你最有效?BASH複製除一個以外的所有文件

+0

爲什麼你需要它來跳過這個文件,而不是複製它後,只是刪除了嗎?它是否已經存在於目標目錄中? – 2009-08-21 18:48:40

+0

是的,具有相同名稱的文件已經存在於目標目錄中。 – 2009-08-21 20:53:02

+0

@ LasseV.Karlsen:或者如果它是一個大文件,您可以節省複製它的時間。我對此感興趣,但不包括目錄而不是文件。 – 2012-11-20 16:13:02

回答

34

簡單,如果src/只包含文件:

find src/ ! -name Default.png -exec cp -t dest/ {} + 

如果src/有子目錄,這忽略了他們,但並複製它們的內部文件:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} + 

如果src/有子目錄,這不會遞歸到它們中:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} + 
+2

這對我來說是最好的,因爲看起來OS X沒有啓用glob。 – 2009-08-21 20:54:31

+1

請問有人能解釋一下命令結尾處的「加號」是什麼?我總是看到\;在-exec選項的末尾,它是一樣的嗎? – Max 2014-09-21 22:28:04

+6

@Max'\;'每個文件執行一次命令。 '+'運行一次命令並將所有文件名一次傳遞給它(受命令行長度限制)。一般來說,'+ +更高效一點。 – 2014-09-22 00:48:51

99

應該如下:

cp -r !(Default.png) /dest 

如果複製到嵌套在當前文件夾(稱爲在下面的案例)的文件夾,你需要省略目錄也:

cp -r !(Default.png|example) /example 
+9

這會產生 -bash:!:未找到事件 – 2009-08-21 18:46:49

+0

是否將文件複製到嵌套在複製文件夾內的文件夾中? – Jon 2009-08-21 18:48:07

+29

這需要'shopt -s extglob'工作,如果它已被禁用。 – 2009-08-21 18:52:40

3

我'd只是這樣做:

cp srcdir/* destdir/ ; rm destdir/Default.png 

除非文件很大。否則使用例如

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/ 
+0

grep -v是你的朋友 – 2009-08-21 19:02:08

+1

第一個命令不是OP所要求的。如果'Default.png'存在於兩個目錄中,它將會替換'srcdir'中的'destdir'中的一個,然後刪除複製的'Default.png'。相反,OP希望保留'destdir'中已存在的'Default.png'。 – SnowFrog 2017-05-22 11:34:33

43

的rsync一直是我的CP/SCP更換了很久:

rsync -av from/ to/ --exclude=Default.png 

-a, --archive    archive mode; equals -rlptgoD (no -H,-A,-X) 
-v, --verbose    increase verbosity 
+2

您的回答與我所有的rsync命令一樣不清楚。這就是爲什麼我不使用它。什麼是'rlptgoD'和什麼是'HAX'?爲什麼要創建一個檔案? – Simon 2017-07-27 07:07:21

1
cp `ls | grep -v Default.png` destdir 
+5

這比您想要的更容易產生錯誤。 – 2009-08-22 01:40:18

+0

這適合我最好的 – once 2017-01-20 03:10:07

-1
# chattr +i /files_to_exclude 
# cp source destination 
# chattr -i /files_to_exclude 
相關問題