xargs rm
invocará rm
con todos los argumentos como parámetro partieron con espacios.
xargs -i{} rm {}
invocará rm {}
para cada uno de los argumentos y {}
será reemplazado por el argumento actual.
Si tiene 2 argumentos a.txt
y b.txt
, xargs rm
llamará esto
rm a.txt b.txt
Pero xargs -i{} rm {}
llamará
rm a.txt
rm b.txt
Esto se debe a que -i
la opción implica -L 1
opción que significa el comando rm
tomará solo 1
línea cada vez. Y aquí cada línea contiene solo 1 argumento.
Consulte este enlace de Ideone para obtener más información al respecto.
Con llaves generará un rm
proceso por archivo. Sin las llaves, xargs
pasará tantos nombres de archivo como sea posible a cada rm
comando.
Comparar
ls | xargs echo
y
ls | xargs -i echo '{}'
La opción -i (equivalente a --replace) crea una especie de marcador de posición donde xargs almacena la entrada que acaba de recibir. En su segundo comando, el marcador de posición es "{}", funciona como la opción find -exec. Una vez definido, xargs reemplazará este marcador de posición con la línea completa de entrada. Si no te gusta el nombre "{}", puedes definir el tuyo propio:
ls | xargs -iPLACEHOLDER echo MARCADOR
En su caso, ambos comandos producen el mismo resultado. En la segunda forma, solo está haciendo explícito el comportamiento predeterminado con la opción -i.