Це можна зробити findбезпосередньо, використовуючи -exec:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Те, що передано, -execбуде викликано один раз для кожного знайденого файлу з {}заміненими параметрами шаблону поточним іменем файлу. Команда \;в кінці знаходження просто закінчує рядок.
Використання xargsв цьому випадку насправді не потрібне, оскільки нам потрібно викликати xmllintодин раз за файл, оскільки імена вхідних і вихідних файлів повинні бути вказані в межах одного виклику.
xargsзнадобиться, якби команда, на яку перебувають з пошуку, працювала над кількома файлами одночасно, і цей список був довгим. У цьому випадку ви не можете цього зробити, оскільки вам потрібно передати одне ім'я файлу до --outputпараметра xmllint. Без xargsви могли б у кінцевому підсумку з «список аргументів занадто довго» помилка , якщо ви обробляєте багато файлів. xargsтакож підтримує рядки заміни файлів з -Iможливістю:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Зробимо так само, як і find -execкоманда, наведена вище. Якщо будь-яка з ваших папок має непарні символи у подібних пробілах, вам потрібно буде скористатися -0параметрами findта xargs. Але використання xargsз -Iувазі можливість , -L 1яка означає тільки обробити 1 файл в той час , в будь-якому випадку, так що ви можете також використовувати безпосередньо findз -exec.