Это может быть сделано с find
помощью -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
То, что передано, -exec
будет вызываться один раз для каждого найденного файла с {}
заменой параметров шаблона на текущее имя файла. Команда \;
on в конце команды find просто завершает строку.
В xargs
этом случае использование на самом деле не обязательно, потому что нам нужно вызывать xmllint
один раз для каждого файла, так как имена входных и выходных файлов должны быть указаны в одном вызове.
xargs
было бы необходимо, если бы команда, передаваемая из find, работала с несколькими файлами одновременно, и этот список был длинным. Вы не можете сделать это в этом случае, так как вам нужно передать одно имя файла --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
.