Здається, існує кілька способів зробити це, включаючи петлі в скрипті оболонки, find та xargs. Який із них найкращий, а який - найбільш портативний?
Здається, існує кілька способів зробити це, включаючи петлі в скрипті оболонки, find та xargs. Який із них найкращий, а який - найбільш портативний?
Відповіді:
find . -exec <command> {} \;
для поточного каталогу як корінь дерева або взагалі:
find <directory> -exec <command> {} \;
-name "*.c"або, наприклад, -type dдля каталогів ...
find ... | xargs ...idiom, вона обробляє файли партіями, і це, як правило, швидше (менше запущених процесів).
Використовуйте -print0опцію пошуку та -0опцію, xargsякщо у вас є імена файлів або каталогів з пробілами:
find {dir} -print0 | xargs -0r {command}
-print0Можливість знайти роздруковує імена файлів як NUL-Поділ , а не пробілами список розділених, в той час як -0опція xargsінструктує їх , щоб розбити його на вхід , NULа не пробілами. Оскільки NULє одним із символів, який не дозволений у іменах Unix, немає можливості помилитися з частиною імені файлу.
-rВаріант є , так що xargsне видаватиме помилку , якщо він не має входу.
Якщо портативність - це проблема, я б тримався осторонь від специфічних для оболонки способів це робити (є багато людей, які використовують безліч різних оболонок, але в цілому пошук і xargs - це справді основні інструменти, які ніхто не наважиться змінити радикально) .
Використання основних аргументів пошуку та xargs повинно дати вам більш портативне рішення.
Якщо групування аргументів разом прийнятне, знайдіть | xargs, ймовірно, дасть кращу продуктивність, оскільки буде виконувати команду набагато менше разів, ніж find -exec. Якщо ви хочете виконувати команду кожен раз для кожного файлу або виконувати в підкаталозі файлу, ви, ймовірно, повинні використовувати find -exec або -execdir.
Як правило, бажано триматися подалі від певних оболонок; find & xargs достатньо для більшості сценаріїв.
Переконайтесь, що версія команди, яку ви використовуєте, ще не містить прапор для рекурсивної операції. :)