find-exec cmd {} + vs | xargs的

哪一个更有效率超过一个非常大的一组文件,应该使用?

find . -exec cmd {} + 

要么

 find . | xargs cmd 

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

速度差异将是微不足道的。

但是你必须确保:

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

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

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

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

要么

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

第一个版本更短,更容易编写,因为你可以忽略1,但是第二个版本更加便携和安全,因为“ -exec cmd {} + ”在GNU findutils中是一个相对较新的选项(自2005年以来,大量运行系统将不会有它), 最近它是越野车 。 也有很多人不知道这个“ -exec cmd {} + ”,你可以从其他答案中看到。

 find . | xargs cmd 

效率更高(它运行cmd次数尽可能less,不像exec ,每次运行cmd一次)。 但是,如果文件名包含空格或时髦字符,则会遇到麻烦。

build议使用以下内容:

 find . -print0 | xargs -0 cmd 

这将工作,即使文件名包含时髦的字符( -print0使find打印NUL终止匹配, -0使xargs期望这种格式。)