错误 mv 目标不是目录并且缺少“-exec”参数

错误 mv 目标不是目录并且缺少“-exec”参数

我正在 Red Hat Enterprise Linux Server 版本 7.5 (Maipo) 中创建一个脚本,以查找test*.txt6 个月前 10 天的所有指定文件。我从中复制的原始目录包含有效文件,但是当我尝试移动文件时,它会出错。下面列出了脚本和错误消息。为什么会失败以及我可以采取哪些措施来修复它?

find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

mv: target    /INTER/f/d/o/test1.txt    is not a directory
mv: target    /INTER/f/d/o/test2.txt    is not a directory
mv: target    /INTER/f/d/o/test3.txt    is not a directory
mv: target    /INTER/f/d/o/test4.txt    is not a directory

此外,当文件在存档目录中保存 7 个月加 10 天后,请将其删除。使用下面的脚本,我收到以下错误。

find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};

find: missing argument to `-exec'

答案1

你的第一个命令:

find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

在这里,我假设您想要移动找到的与模式匹配且足够旧的文件。命令mv位格式错误,应该类似于

-exec mv {} /some/destination/path \;

即,“将找到的文件( {})移动到某个目的地”。

从命令中不清楚您希望将文件移动到哪里,但是当您编写它时,您正在移动文件找到的路径名。这会失败,因为mv尝试将多个文件移动到非目录的位置。

在你的第二个命令中,

find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};

你只是未能正确地终止论证-exec。最后一点应该看起来像

-exec rm {} \;

或者简单地

-delete

如果您的实现find支持这一点。

也可以看看 ”了解“find”的 -exec 选项”。

答案2

你的第一个命令:

find ... -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

将传递给mv参数/INTER/f/d/o/test*.txt(字面意思是带有星号),/INTER_ARCHIVE/f/d/o/然后传递给当前find正在处理的文件。mv看到三个参数,因此它希望将前两个移动到第三个,然后第三个参数必须是目录。

不会test*.txt扩展到任何匹配的文件名,因为find-exec通过 shell 运行命令(您必须使用-exec sh '...' \;它)。不管怎样,你并不是想这样做,因为test*.txt在这里通配符会违背-mtime.

你可能想要的是

find ... -exec mv {} /INTER_ARCHIVE/f/d/o/ \;

find将当前正在处理的文件移动到/INTER_ARCHIVE/f/d/o/

或者使用 GNU mv

find ... -exec mv -t /INTER_ARCHIVE/f/d/o/ {} +

通过一次调用来处理多个文件mv

相关内容