哪一个对一大堆文件更有效并应该使用?
find . -exec cmd {} +
或
find . | xargs cmd
(假设文件名中没有有趣的字符)
答案 0 :(得分:102)
速度差异无关紧要。
但你必须确保:
您的脚本不会假设没有 文件将包含空格,制表符等 文件名;第一个版本是 安全,第二个不是。
您的脚本不会将以“-
”开头的文件视为选项。
所以你的代码应该是这样的:
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