什么是-exec缺少的参数?
我使用以下命令清除超过30天的文件和目录的目录,并将它们移动到一个存档目录,如果没有人要求他们返回文件,我可以在几周后删除它。 目标目录按用户名包含子目录,归档目录也是如此。
这是我使用的命令:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
我建议修改这个版本来回答一个关于问问ubuntu的问题,另一个用户编辑了代码来改变行尾\;
for +
因为它更快(更正确吗?)。 看这里
但是,如果-exec
命令是ls -lh
但在我使用的实际命令中没有, ls -lh
这种方式使用+
。 如果我用+
尝试它我收到一条错误消息:
find: missing argument to '-exec'
我不明白为什么它会这样做,或者正确的命令是什么。 请不要发布命令更正,我想了解而不是盲目地遵循建议。
该post中的用户可能会说-exec
命令末尾的+
号更快,但不是原因。
让我们假设find
命令返回以下文件:
/path/to/file1 /path/to/file2 /path/to/file3
普通的-exec
命令( -exec command {} \;
)为每个匹配的文件运行一次。 例如:
find ... -exec mv {} /target/ \;
执行:
mv /path/to/file1 /target/ mv /path/to/file2 /target/ mv /path/to/file3 /target/
如果使用+
号( -exec command {} +
),则通过在命令末尾添加多个匹配的文件来构建命令。 例如:
find ... -exec mv -t /target/ {} +
执行:
mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3
要正确使用+
标志,要处理的参数必须位于命令的末尾,而不是中间。 这就是为什么在你的例子中find
trows missing argument to '-exec'
的原因; 它错过了收盘{}
。
用户解释了他们的编辑….
……使用此链接 。 我认为基本上不是使用多个命令,而是将所有文件名发送到一个命令实例,以加快速度。 这是一个例子:
使用带分号的-exec(
find . -exec ls '{}' \;
)将执行ls file1 ls file2 ls file3
但是如果你使用加号(
find . -exec ls '{}' \+
),所有文件名将作为参数传递给单个命令:ls file1 file2 file3
还有其他forms可供使用;
和+
以及(从这里 🙂
因此,find命令允许使用以下示例语法:
find . -exec echo {} \; find . -exec echo {} ';' find . -exec echo {} ";" find . -exec echo {} \+ find . -exec echo {} +
但是,我不确定这是否适用于move命令,因为它的语法是mv [OPTION]... SOURCE DEST
,除非使用-t
选项或类似命令。 但是它应该与没有额外选项等的ls
一起工作,因为他们可以理解何时给出多个文件名。 +
也可能需要转义(即\+
)