我试图找到当前目录和子目录中的所有 .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 {} +