Esto se puede hacer finddirectamente usando -exec:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Lo que se pasa -execse invocará una vez por cada archivo encontrado con los parámetros de plantilla {}reemplazados por el nombre del archivo actual. El \;final del comando find termina la línea.
El uso de xargsno es realmente necesario en este caso porque necesitamos invocar xmllintuna vez por archivo ya que los nombres de los archivos de entrada y salida deben especificarse dentro de la misma llamada.
xargssería necesario si el comando que se canaliza desde find funciona en varios archivos a la vez y esa lista es larga. No puede hacer eso en este caso, ya que necesita pasar el nombre de archivo único a la --outputopción de xmllint. Sin xargsusted, podría terminar con un error de "Lista de argumentos demasiado larga" si está procesando muchos archivos. xargstambién admite cadenas de reemplazo de archivos con la -Iopción:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Haría lo mismo que el find -execcomando anterior. Si alguna de sus carpetas tiene caracteres extraños en espacios similares, deberá usar las -0opciones de findy xargs. Pero usar xargscon -Iimplica la opción -L 1que significa procesar solo 1 archivo a la vez de todos modos, por lo que también puede usar directamente findcon -exec.