Esto se puede hacer find
directamente usando -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Lo que se pasa -exec
se 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 xargs
no es realmente necesario en este caso porque necesitamos invocar xmllint
una vez por archivo ya que los nombres de los archivos de entrada y salida deben especificarse dentro de la misma llamada.
xargs
serí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 --output
opción de xmllint
. Sin xargs
usted, podría terminar con un error de "Lista de argumentos demasiado larga" si está procesando muchos archivos. xargs
también admite cadenas de reemplazo de archivos con la -I
opción:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Haría lo mismo que el find -exec
comando anterior. Si alguna de sus carpetas tiene caracteres extraños en espacios similares, deberá usar las -0
opciones de find
y xargs
. Pero usar xargs
con -I
implica la opción -L 1
que significa procesar solo 1 archivo a la vez de todos modos, por lo que también puede usar directamente find
con -exec
.