Это может быть сделано от 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
.
Я обычно принимаюсь за решение этих проблем со слоем косвенности. Запишите сценарий оболочки, который делает то, что Вы хотите, и вызов это. Я предложил бы как запуск
#! /bin/sh
for file
do
xmllint --format $file > $file.tmp && mv $file.tmp $file
done
Попытка это на файле или два вручную, затем можно заменить его в xargs
find . -name "*.xml" -type f | xargs -- xmltidy.sh
find … -exec
самый прямой путь состоит в том, чтобы сделать это. – Gilles 'SO- stop being evil' 09.10.2012, 02:02