Bash

將特定文件複製到不同的目錄

  • April 18, 2020

我正在嘗試查找具有特定副檔名的文件並將其複製或同步到另一個硬碟驅動器/目錄

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/testinto ~/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/ \; \)

引用自:https://unix.stackexchange.com/questions/580998