Найкраще виконати команду над кожним файлом у дереві каталогів


13

Здається, існує кілька способів зробити це, включаючи петлі в скрипті оболонки, find та xargs. Який із них найкращий, а який - найбільш портативний?

Відповіді:


13
find . -exec <command> {} \;

для поточного каталогу як корінь дерева або взагалі:

find <directory> -exec <command> {} \;

4
у деяких системах не знайдіть опцію -exec, яку ви можете використовувати find. | xargs <Command>
Hemant

4
Дійсно, і якщо вам потрібно щось фільтрувати, спробуйте -name "*.c"або, наприклад, -type dдля каталогів ...

Ви можете знайти напрочуд складні речі - можливо, ви захочете перевірити довідкову сторінку - unixhelp.ed.ac.uk/CGI/man-cgi?find - для повного списку опцій.
Лукас Джонс

Ви також можете стежити за назви файлів з пробілами, які можуть порушити підхід -exec і xargs. Дивіться tinyurl.com/ygvgmw5
Шон Чин

Якщо можливо, використовуйте find ... | xargs ...idiom, вона обробляє файли партіями, і це, як правило, швидше (менше запущених процесів).
фонбранд

5

Використовуйте -print0опцію пошуку та -0опцію, xargsякщо у вас є імена файлів або каталогів з пробілами:

find {dir} -print0 | xargs -0r {command}

-print0Можливість знайти роздруковує імена файлів як NUL-Поділ , а не пробілами список розділених, в той час як -0опція xargsінструктує їх , щоб розбити його на вхід , NULа не пробілами. Оскільки NULє одним із символів, який не дозволений у іменах Unix, немає можливості помилитися з частиною імені файлу.

-rВаріант є , так що xargsне видаватиме помилку , якщо він не має входу.


3

Якщо портативність - це проблема, я б тримався осторонь від специфічних для оболонки способів це робити (є багато людей, які використовують безліч різних оболонок, але в цілому пошук і xargs - це справді основні інструменти, які ніхто не наважиться змінити радикально) .

Використання основних аргументів пошуку та xargs повинно дати вам більш портативне рішення.


2

Якщо групування аргументів разом прийнятне, знайдіть | xargs, ймовірно, дасть кращу продуктивність, оскільки буде виконувати команду набагато менше разів, ніж find -exec. Якщо ви хочете виконувати команду кожен раз для кожного файлу або виконувати в підкаталозі файлу, ви, ймовірно, повинні використовувати find -exec або -execdir.

Як правило, бажано триматися подалі від певних оболонок; find & xargs достатньо для більшості сценаріїв.


1

Переконайтесь, що версія команди, яку ви використовуєте, ще не містить прапор для рекурсивної операції. :)


0
find [args] -print | xargs {command}

Для мене найкраще працює.


2
-1 Не працюватиме для файлів, що містять пробіли. Краще використовувати find -print0 | xargs -0.
starblue
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.