find -exec cmd {} + vs | xargs的

时间:2009-05-22 08:08:03

标签: linux unix command-line find

哪一个对一大堆文件更有效并应该使用?

find . -exec cmd {} +

find . | xargs cmd

(假设文件名中没有有趣的字符)

3 个答案:

答案 0 :(得分:102)

速度差异无关紧要。

但你必须确保:

  1. 您的脚本不会假设没有 文件将包含空格,制表符等 文件名;第一个版本是 安全,第二个不是。

  2. 您的脚本不会将以“-”开头的文件视为选项。

  3. 所以你的代码应该是这样的:

    find . -exec cmd -option1 -option2 -- {} +
    

    find . -print0 | xargs -0 cmd -option1 -option2 --
    

    第一个版本更短更易于编写,因为您可以忽略1,但是 第二个版本更具可移植性和安全性,因为“-exec cmd {} +”在GNU findutils中是一个相对较新的选项(自2005年以来,许多正在运行的系统还没有它)并且它是buggy recently。也有很多人不知道这个“-exec cmd {} +”,你可以从其他答案中看到。

答案 1 :(得分:8)

find . | xargs cmd

效率更高(尽可能少地运行cmd,与exec不同,cmd每次匹配运行find . -print0 | xargs -0 cmd 一次。但是,如果文件名包含空格或时髦字符,则会遇到麻烦。

建议使用以下内容:

-print0

即使文件名包含时髦字符(find使-0打印NUL终止的匹配,xargs使{{1}}期望此格式,这也会有用。)

答案 2 :(得分:2)

现代xargs版本通常支持并行管道执行。

显然,它可能是两者之间选择的支点 find … -exec… | xargs