Isso pode ser feito finddiretamente usando -exec:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
O que foi passado -execserá 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 xargsrealmente não é necessário nesse caso, porque precisamos chamar xmllintuma vez por arquivo, pois os nomes dos arquivos de entrada e de saída devem ser especificados na mesma chamada.
xargsseria 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 --outputopção de xmllint. Sem xargsvocê, você pode acabar com um erro "A lista de argumentos é muito longa" se estiver processando muitos arquivos. xargstambém suporta seqüências de substituição de arquivo com a -Iopção:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Faria o mesmo que o find -execcomando acima. Se alguma de suas pastas tiver caracteres ímpares em espaços iguais, você precisará usar as -0opções de finde xargs. Mas usar xargscom -Iimplica a opção -L 1que significa que apenas processar um arquivo de cada vez qualquer maneira, então você pode também usar diretamente findcom -exec.