-exec缺少什么参数?


15

我使用以下命令清除目录和超过30天的文件和目录,然后将其移动到存档目录,如果没有人要求他们提供文件,则可以在几周后删除。目标目录按用户名具有子目录,存档目录也具有子目录。

这是我使用的命令:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

我建议对此进行修改,以回答关于Ask ubuntu的问题,另一个用户编辑了代码以更改行尾\;+因为它更快(更正确?)。看这里

但是,+如果-exec命令ls -lh不在我使用的实际命令中,则以这种方式使用可以工作。如果尝试使用,则会+收到错误消息:

find: missing argument to '-exec'

我不明白为什么会这样,或者正确的命令是什么。请不要仅仅发布命令更正,我想了解而不是盲目地遵循建议。


你指的是这个答案吗?可能可以解释为什么
Wilf

谢谢@Wilf,我已更新为显示发生修改的答案。您提供的链接还有一个进一步的链接,以我的大脑可以应付的方式对其进行了说明。
Arronical


以出色的循环方式感谢@souravc,这个问题是由编辑我的命令的用户引起的!最终,我得到它+为同一命令提供多个参数,但是mv无法解决!
Arronical

@Arronical mv可以,请看我的回答^^
混乱

Answers:


19

该帖子中的用户可能会说命令+结尾处的符号-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不遗余力missing argument to '-exec';它错过了结帐{}


我一直想知道为什么当与一起使用时,为什么find -exec要求the {}必须是最后一个arg +。有谁知道为什么要做出设计决定,而不是让像OP的命令行这样的构造起作用?
彼得·科德斯

11

用户解释了他们的编辑...。

'+'执行程序的终止符比'\;'更快  参见/ubuntu/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

使用;和还有其他可用形式+(从这里开始:)

因此,find命令允许使用以下示例语法:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

但是,我不确定这是否可以与move命令一起使用,因为它的语法是 mv [OPTION]... SOURCE DEST,除非使用了-t选项或类似选项。但是,它应该ls不带任何其他选项,因为它们可以理解给定多个文件名的情况。该+还可能需要进行转义(即\+


两者都是很好的答案,但由于速度稍快,我不得不把它弄乱了,并解释了mv -t,但+1都是!
Arronical
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.