2017-02-24 139 views
1

我有一個/dir1,該結構是:如何將目錄及其子目錄中的所有文件複製到另一個目錄?

./aaa.txt 
./bbb.jpg 
./subdir1/cccc.doc 
./subdir1/eeee.txt 
./subdir2/dddd.xls 
./subdir2/ffff.jpg 

我想在/dir1所有.txt.jpg及其子目錄複製到/dir2

通過使用cp -r /dir1/* /dir2,它將所有文件及其結構複製到/dir2

通過使用cp -r /dir1/*.jpg /dir2cp -r /dir1/*.txt /dir2,它不.jpg.txt文件複製子目錄。

通過使用

for FILE in `find` 
do 
    cp -f $FILE /dir1/ 
done 

它可以在目錄和子目錄中的所有文件複製到目標,但我不能過濾的文件類型。

有沒有另一種方法可以實現我想要的?

+1

'*但我無法過濾文件類型*'當然可以,'find'就是很棒的。 – Biffen

+0

我用'man find',它顯示我''type f'有關,但是我看到'f常規文件',它沒有告訴我如何將它與'-name'結合起來。什麼是閱讀手冊的正確方法? –

+0

'man find'是閱讀手冊的好方法。結合'-type'和'-name'只需一個接一個:'find。 -type f -name'* .jpg'' – Biffen

回答

3

您可以使用find以獲得所需的源文件,然後使用cp-exec謂詞find內將文件複製到所需的目的地。與GNU cp

find /dir1/ -type f \(-name '*.txt' -o -name '*.jpg' \) -exec cp -t /dir2/ {} + 

POSIX-LY:

find /dir1/ -type f \(-name '*.txt' -o -name '*.jpg' \) -exec cp {} /dir2/ \; 
+0

謝謝。它岩石 –

1

隨着globstarextglob殼選項:

shopt -s globstar extglob 
cp dir1/**/*[email protected](txt|jpg) dir2 

**/表達式匹配零個或多個目錄或子目錄,所以你從的整個子樹中獲取文件; @(txt|jpg)是與txtjpg匹配的擴展模式。

對於有些偶然的情況下,有任何的dir1沒有.jpg.txt文件,而是一個名爲**dir1子目錄稱爲*[email protected](txt|jpg)文件,你可能還需要設置failglob外殼選項,命令不是如果glob不匹配–而不是複製不太可能的文件,則執行。


globstar在擊4.0的溶液中加入,並因此不能用於該附帶的Mac OS(3.2)標準的擊。

+0

第一個聲明做什麼?我試圖'人設置',它告訴我沒有'set'的手冊。我執行了你的陳述,它告訴我'set -s'是無效的。 –

+1

這是一個愚蠢的錯字,應該是'shopt'! –

相關問題