Bash
將特定文件複製到不同的目錄
我正在嘗試查找具有特定副檔名的文件並將其複製或同步到另一個硬碟驅動器/目錄
sudo find . \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/test/dest/ \; \)
和外殼輸出是這樣的:
cp: './dest/DSC_0085.JPG' and '/home/sanz/test/dest/DSC_0085.JPG' are the same file cp: './dest/DSC_0086.avi' and '/home/sanz/test/dest/DSC_0086.avi' are the same file
等等…
為什麼它一直告訴我我正在複製的內容和嘗試複製的位置是同一個文件,即使它們位於不同的導演中。這是沒有意義的。
我也在嘗試不同的命令變體,但它也無法正常工作:
sudo find . -type f -iname '*.jpg' -o -name "*png" -o -name "*mov" -o -name "*mp3" -o -name "*mp4" -o -name "*swf" -o -name "*avi" -exec rsync -ah --progress {} ~/test/dest \;
它只複製 avi 文件並完全忽略其他文件。我很奇怪沒有 -exec 的相同命令通常如何輸出所有特別標記的文件,但是當我希望它與複製命令一起工作時,它只讀取/複製 avi 文件。
您正在執行該命令,
/home/sanz/test
然後查找名稱在其中任何位置指定的文件,其中包括dest
標識find
為./dest
. 那是同一個目錄~/test/dest/
,/home/sanz/test/dest/
因此您實際上是在嘗試將目錄和文件複製到它們自己中。如果要查找並複制其中的文件
/home/sanz/test
into~/test/dest
,則需要使用-prune
排除選項/home/sanz/test/dest
:sudo find . -path ./dest -prune -o \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/test/dest/ \; \)