find的-exec命令中的{} +是什么意思?


23

我想知道的含义{} +exec命令,之间有什么区别{} +{} \;。确切地说,这两者之间有什么区别:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;

5
对其进行man find(1)了详细描述,任何人都可以轻松找到它。别偷懒
MiroslavKoškár2015年

谢谢亲爱的米罗斯拉夫,我搜索了man exec

啊,我以前从未见过这种{} +用法。我通常(经常find ... -print0 | xargs -0 ...)使用xargs

Answers:


27

为了终止/ 调用的shell命令,必须使用;(分号)或+(加号)。-execexecdir

;(分号)或+(加号)之间的区别在于参数如何传递到find的-exec/ -execdir参数中。例如:

  • using ;将执行多个命令(每个参数分别执行),

    例:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    后面的所有自变量find均被视为命令的自变量。

    该字符串{}将替换为当前正在处理的文件名。

  • using +将执行最少的命令(因为参数组合在一起)。这与xargs命令的工作原理非常相似,因此它将在每个命令中使用尽可能多的参数,以避免超出每行参数的最大限制。

    例:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    通过在每个末尾附加每个选定的文件名来构建命令行。

    命令中仅{}允许的一个实例。

也可以看看:


这里一个区别和主要的一个。见user1116056的答案
Jahid

24

鉴于命令find得到以下三个文件:

fileA
fileB
fileC

如果您使用-exec加号(+),

find . -type f -exec chmod 775 {} +  

这将是:

chmod 775 fileA fileB fileC

通过在每个末尾附加每个匹配的文件名来xargs构建命令行,这与构建其命令行的方式相同。该命令的调用总数(chmod在这种情况下为)将远远少于匹配文件的数量。

如果您使用-exec分号(;),

find . -type f -exec chmod 775 {} \;

这将是:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC

5

按照man find

-exec命令{} + -exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将大大少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅允许使用一个'{}'实例。该命令在起始目录中执行。

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.