移动命令错误目标不是UNIX目录



我是unix的新手,我正在尝试编写一个bash,将所有以.c结尾的文件移动到另一个文件夹。当我执行命令时:find ~/testfiles -name '*.c' -exec mv -i ~/destination {} +我得到一个错误:mv: target '/home/user/testfiles/dir3/sourcefile1.c' is not a directory.

testfiles文件夹包括文件和文件夹。如果有帮助的话,我正在使用ubuntu 20.04。。谢谢你抽出时间。

find -exec中,{}被找到的文件/目录替换。示例中使用的mv命令试图将第一个参数移动到第二个参数,因此您的参数顺序错误。

这是正确的:

[[ -d ~/destination ]] && find ~/testfiles -name '*.c' -exec mv -i '{}' ~/destination ;

一个稍微有效的方法是使用mv-t(目标(选项,这意味着您可以在find中使用+(一次为mv提供尽可能多的参数(:

[[ -d ~/destination ]] && find ~/testfiles -name '*.c' -exec mv -i -t ~/destination '{}' +

我在find命令之前添加了[[ -d ~/destination ]] &&,因为一个常见的错误是将许多文件移动到同一个目标,如果它不存在(或者是文件而不是目录(,它将创建一个名为destination的文件,并用所有文件覆盖它,使您丢失所有文件(最后移动的文件除外(。

-exec+;的转换说明直接取自我的man find页面:

-exec command ;

在遇到由;组成的参数之前,要查找的所有以下参数都将作为命令的参数。字符串{}在命令参数中出现的所有位置都被正在处理的当前文件名替换。。。为每个匹配的文件运行一次指定的命令。。。

-exec command {} +

-exec操作的此变体在选定的文件上运行指定的命令,但通过在末尾附加每个选定的文件名来构建命令行;命令行的构建方式与xargs构建命令行的方式大致相同。命令中只允许{}的一个实例。。。

请注意,语法不同,对于第二个版本,{} +必须位于末尾(它正在附加文件(。

相关内容

  • 没有找到相关文章

最新更新