我是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
构建命令行的方式大致相同。命令中只允许{}
的一个实例。。。
请注意,语法不同,对于第二个版本,{} +
必须位于末尾(它正在附加文件(。