使用 Mac OS X 終端機將選定的資料夾複製到新位置,並具有合併行為

使用 Mac OS X 終端機將選定的資料夾複製到新位置,並具有合併行為

我有一個資料夾“foo”,其中包含很多子資料夾,例如

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

還有更多的事情,但希望它能解釋這個場景。我現在想將此資料夾中以“2011”開頭的所有資料夾複製到“foo”的同級資料夾“bar”中。但是,「bar」已經包含一些同名的資料夾

bar
 |---20111
 |---20113
 |---20114

應合併來源資料夾和目標資料夾的內容。請注意,該腳本還需要建立一個 bar/20112 資料夾,因為該資料夾不存在。

我是 Mac 終端機腳本新手,並且已成功地 grep 正確的資料夾

foo>ls | grep ^2011 

其中列出了正確的資料夾,但我不知道如何將其通過管道傳輸到適當的複製操作。

答案1

複製命令是cp.如果你給它-r(遞歸)標誌,它會完全按照你想要的方式執行,它將檔案複製到現有資料夾中,並在目標資料夾遺失時建立新資料夾。

然而,你不應該解析的輸出ls,你應該使用find,或者更簡單,bash 通配符:

cp -rv foo/2011* bar/

如果存在名稱以 開頭的檔案和資料夾2011,請使用find及其-exec選項,該選項會將您提供的任何命令套用至透過find(稱為{})找到的所有內容:

find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;

在這種特定情況下,沒有理由保存命令的輸出並將其傳遞給cp.有時這是必要的,所以這裡是如何完成的。一般來說,如果將一個命令的輸出放置在倒逗號或 內,則可以將其作為另一個命令的輸入$()

cp -rv `find foo/ -type d -name "2011*"` bar/

或者

cp -rv $(find foo/ -type d -name "2011*") bar/

或者,您可以循環遍歷結果:

for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done

如果您的檔案/資料夾名稱可以包含特殊字元或換行符等,這會變得更加複雜,在這種情況下您應該執行以下操作:

find foo/ -type d -name "2011*" | while IFS= read -r dir; do 
       cp -rv "$dir" bar/; 
done

相關內容