我正在尝试查找具有特定扩展名的文件并将其复制或 rsync 到另一个硬盘驱动器/目录
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/ \; \)
shell 输出是这样的:
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 文件。
答案1
您正在运行该命令/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/ \; \)
答案2
事实证明,如果您将文件从目录复制到该目录的子目录,就像您在同一目录复制相同的文件一样,正如弗雷迪所说。所以我在其他地方创建了目录,在我把头砸向键盘之后,我创建了以下代码:
sudo find ~/test/ \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/dest/ \; \)
这很有魅力。我没有这些技术术语的术语,但我希望你们能理解我。