Isso pode ser feito diretamente de find
usando -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
O que é transmitido para -exec
será chamado uma vez por arquivo encontrado com os parâmetros de modelo {}
sendo substituído pelo nome do arquivo atual. O \;
no final do comando find termina a linha.
O uso de xargs
não é realmente necessário neste caso, porque precisamos invocar xmllint
uma vez por arquivo, pois os nomes dos arquivos de entrada e saída devem ser especificados dentro da mesma chamada.
xargs
seria necessário se o comando que estava sendo enviado do find estivesse trabalhando em vários arquivos por vez e essa lista fosse longa. Você não pode fazer isso nesse caso, já que precisa passar o nome de arquivo único para a opção --output
de xmllint
. Sem xargs
você pode acabar com um erro "Argument List too long" se estiver processando muitos arquivos. xargs
também suporta strings de substituição de arquivos com a opção -I
:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Faria o mesmo que o comando find -exec
acima. Se alguma das suas pastas tiver caracteres estranhos em espaços semelhantes, você precisará usar as opções -0
de find
e xargs
. Mas usar xargs
com -I
implica na opção -L 1
, que significa processar apenas um arquivo de cada vez, portanto, você também pode usar diretamente find
com -exec
.