123

哪一个对非常大的文件集更有效并且应该使用?

find . -exec cmd {} +

或者

find . | xargs cmd

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

4

3 回答 3

114

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

但您必须确保:

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

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

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

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

或者

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

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

于 2009-05-22T09:22:36.657 回答
9
find . | xargs cmd

效率更高(它运行cmd的次数越少越好,不像exec,每场比赛运行cmd一次)。但是,如果文件名包含空格或时髦字符,您将遇到麻烦。

建议使用以下方法:

find . -print0 | xargs -0 cmd

即使文件名包含时髦的字符,这也会起作用(-print0使find打印以 NUL 结尾的匹配,-0使xargs期望这种格式。)

于 2009-05-22T08:23:36.633 回答
2

Modernxargs的版本通常支持并行管道执行。

显然,在选择 find … -exec… | xargs

于 2018-04-24T02:30:17.853 回答