使用 -execdir 查找命令不读取标志?

Bri*_*ant 3 shell bash find

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

mv: cannot move './file' to '/destination': File exists
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的命令:

find . -iname *jpg -execdir mv -f {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

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


更新:上面列出的命令不是我实际通过的(害羞地叹了口气)。实际命令确实包含一个目的地(如先前@Gilles 的回答中所建议的那样):

find . -iname '*jpg' -execdir mv -f {} /destination \;
Run Code Online (Sandbox Code Playgroud)

我再次传递了这个命令以确保我确实包含了 /destination 目录,但我收到了同样的错误:

mv: cannot move './file' to '/destination': File exists
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 5

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

首先要注意,如果*jpg当前目录下有匹配的文件,模式*jpg会在find. 您需要引用模式以防止出现这种情况。

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

cd directory && mv -f file
Run Code Online (Sandbox Code Playgroud)

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

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

find -iname '*.jpg' -execdir mv -f {} /common-destination-directory
Run Code Online (Sandbox Code Playgroud)

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

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -f {} images \;
Run Code Online (Sandbox Code Playgroud)

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

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -t images {} +
Run Code Online (Sandbox Code Playgroud)