什么是-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的终结符比'\;'快请参阅https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command;从原始文件创建备份文件是个好主意

……使用此链接 。 我认为基本上不是使用多个命令,而是将所有文件名发送到一个命令实例,以加快速度。 这是一个例子:

使用带分号的-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一起工作,因为他们可以理解何时给出多个文件名。 +也可能需要转义(即\+