我试图在我的当前目录和子目录中找到所有 .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 目录?
您声称正在执行的命令与您收到的错误消息不匹配,但无论哪种方式,这个答案都应该澄清一些事情。
首先要注意,如果*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)