Відповіді:
Різниця швидкостей буде незначною.
Але ви повинні переконатися, що:
Ваш сценарій не передбачає, що жоден файл не матиме місця, вкладки тощо у назві файлу; перша версія безпечна, друга - ні.
Ваш сценарій не буде розглядати файл, який починається з " -
" як опцію.
Отже, ваш код повинен виглядати так:
find . -exec cmd -option1 -option2 -- {} +
або
find . -print0 | xargs -0 cmd -option1 -option2 --
Перша версія є коротшою та простішою для написання, оскільки ви можете ігнорувати 1, але друга версія є більш портативною та безпечною, оскільки " -exec cmd {} +
" є відносно новим варіантом у GNU findutils (з 2005 року багато операційних систем її ще не мають) і це було баггі нещодавно . Також багато людей не знають цього " -exec cmd {} +
", як видно з інших відповідей.
exec
буде видавати результати, коли вони знайдені, xargs
коли, схоже, буде чекати, поки весь каталог буде шуканий, перш ніж писати в stdout. Якщо ви намагаєтеся це у великому каталозі, і здається, що xargs
це не працює, терпіння доцільно.
-print0
пошуку повертає назви файлів, розділені новим рядком, але новий рядок також може бути частиною імені файлу, що робить його неоднозначним. Байт 0 не може, тому це безпечний роздільник. Так - додавання --
до команди, яка його підтримує, є хорошою практикою, коли ви не можете контролювати її аргументи, навіть якщо це не завжди суворо потрібно або небезпечно.
find . | xargs cmd
є більш ефективним (він працює cmd
як можна менше разів, на відміну від exec
, який працює cmd
один раз на кожен матч). Однак у вас виникнуть проблеми, якщо в назви файлів містяться пробіли або фанкі.
Пропонується використовувати наступне:
find . -print0 | xargs -0 cmd
це буде працювати, навіть якщо назви файлів містять фанкі ( -print0
змушує find
друкувати збіги, що закінчуються NUL, -0
змушує xargs
очікувати цього формату).
xargs
підхід насправді значно повільніший, якщо немає (або лише декілька) відповідних файлів і cmd
не має багато що робити для кожного файлу. Наприклад, при запуску в порожньому каталозі xargs
версія займе щонайменше вдвічі більше часу, оскільки два процеси потрібно запустити замість лише одного. (Так, різниця, як правило, непомітна для * nix, але в циклі це може бути важливо; або спробуйте це в Windows деякий час ...)