繁体   English   中英

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

[英]Move command error target is not directory 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{}find -exec的文件/目录替换。 在您的示例中使用的mv命令试图将第一个参数移动到第二个参数,因此您的参数顺序错误。

这是正确的:

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

稍微更有效的方法是使用mv s -t (target) 选项,这意味着您可以在find使用+ (一次向mv提供尽可能多的参数):

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

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

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

-exec command ;

find 的所有以下参数都被视为命令的参数,直到参数由; 遇到了。 字符串{}被当前正在处理的文件名替换,它出现在命令的参数中的任何地方,...指定的命令对每个匹配的文件运行一次。 ...

-exec command {} +

-exec动作的这个变体在选定的文件上运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建 命令行的构建方式与xargs构建其命令行的方式非常相似。 命令中只允许一个{}实例,...

请注意,语法有所不同,第二个版本的{} +必须位于末尾(附加文件的位置)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM