Это может быть сделано с 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.