带有 -execdir 的 find 命令不读取标志?

带有 -execdir 的 find 命令不读取标志?

我试图找到当前目录和子目录中的所有 .jpg 图片文件,并将它们移动到另一个目录。我希望源文件覆盖目标文件,但这没有发生。当我运行命令时,我得到一些文件的以下输出(但其他文件已移动):

mv: cannot move './file' to '/destination': File exists

这是我正在使用的命令:

find . -iname *jpg -execdir mv -f {} \;

似乎 -f(强制)选项不起作用?

当我返回并处理mv -f ./source/file /dest单个文件时,它确实正确覆盖了。

这是怎么回事?为什么文件没有被移动?


更新:上面列出的命令不是我实际通过的(羞涩地叹了口气)。实际命令做过包括一个目的地(如之前@Gilles 的答案中所建议的):

find . -iname '*jpg' -execdir mv -f {} /destination \;

我再次传递此命令以确保我确实包含了 /destination 目录,并且收到了相同的错误:

mv: cannot move './file' to '/destination': File exists

即使在 mv 命令中使用 /destination 目录,是否有任何可能的答案来解释为什么会显示此错误?

答案1

您声称正在执行的命令与您收到的错误消息不匹配,但无论哪种方式,这个答案都应该澄清一些事情。

*jpg首先,请注意,如果当前目录中有任何匹配的文件,则该模式*jpg将在find.您需要引用该模式来防止这种情况。

使用您给出的命令,执行的内容类似于

cd directory && mv -f file

mv需要两个参数:源文件和目标。

您需要传递一个目标目录,并且由于您使用的是-execdir,因此目标目录将相对于每个包含.jpg文件的目录进行解释。注意该目录必须存在。如果要将所有.jpg文件移动到单个目录,请先创建它,然后运行

find -iname '*.jpg' -execdir mv -f {} /common-destination-directory

如果要将所有文件移动到相对路径,例如将它们移动到images相对于其所在位置的子目录,则需要先创建该目录。

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -f {} images \;

mv使用 GNU 实用程序(即在 Linux 上),您可以通过每个目录仅运行一次来​​进行一些优化:

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -t images {} +

相关内容