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