Відповіді:
Різниця швидкостей буде незначною.
Але ви повинні переконатися, що:
Ваш сценарій не передбачає, що жоден файл не матиме місця, вкладки тощо у назві файлу; перша версія безпечна, друга - ні.
Ваш сценарій не буде розглядати файл, який починається з " -" як опцію.
Отже, ваш код повинен виглядати так:
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 деякий час ...)