哪一个对非常大的文件集更有效并且应该使用?
find . -exec cmd {} +
或者
find . | xargs cmd
(假设文件名中没有有趣的字符)
哪一个对非常大的文件集更有效并且应该使用?
find . -exec cmd {} +
或者
find . | xargs cmd
(假设文件名中没有有趣的字符)
速度差异将是微不足道的。
但您必须确保:
您的脚本不会假设文件名中没有空格、制表符等;第一个版本是安全的,第二个不是。
您的脚本不会将以“ -
”开头的文件视为选项。
所以你的代码应该是这样的:
find . -exec cmd -option1 -option2 -- {} +
或者
find . -print0 | xargs -0 cmd -option1 -option2 --
第一个版本更短更容易编写,因为你可以忽略 1,但第二个版本更便携和安全,因为 " -exec cmd {} +
" 是 GNU findutils 中相对较新的选项(自 2005 年以来,许多正在运行的系统还没有它)最近有车。-exec cmd {} +
正如您从其他答案中看到的那样,很多人也不知道这个“ ”。
find . | xargs cmd
效率更高(它运行cmd
的次数越少越好,不像exec
,每场比赛运行cmd
一次)。但是,如果文件名包含空格或时髦字符,您将遇到麻烦。
建议使用以下方法:
find . -print0 | xargs -0 cmd
即使文件名包含时髦的字符,这也会起作用(-print0
使find
打印以 NUL 结尾的匹配,-0
使xargs
期望这种格式。)
Modernxargs
的版本通常支持并行管道执行。
显然,在选择
find … -exec
和
… | xargs