xargs rm
invoquera rm
avec tous les arguments comme paramètre départ avec des espaces.
xargs -i{} rm {}
invoquera rm {}
pour chacun des arguments et {}
sera remplacé par l'argument actuel.
Si vous avez 2 arguments a.txt
et b.txt
, xargs rm
appellera ça
rm a.txt b.txt
Mais xargs -i{} rm {}
appellera
rm a.txt
rm b.txt
C'est parce que -i
l'option implique -L 1
option qui signifie la commande rm
ne prendra que 1
ligne à chaque fois. Et ici chaque ligne ne contient qu'un seul argument.
Consultez ce lien Ideone pour en savoir plus.
Avec des accolades, il générera un rm
processus par fichier. Sans les accolades, xargs
transmettra autant de noms de fichiers que possible à chaque rm
commande.
Comparer
ls | xargs echo
et
ls | xargs -i echo '{}'
L'option -i (équivalente à --replace) crée une sorte d'espace réservé où xargs stocke l'entrée qu'il vient de recevoir. Dans votre deuxième commande, l'espace réservé est "{}", cela fonctionne comme l'option find -exec. Une fois défini, xargs remplacera cet espace réservé par la ligne entière d'entrée. Si vous n'aimez pas le nom "{}", vous pouvez définir le vôtre :
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
Dans votre cas, les deux commandes produisent le même résultat. Dans le second formulaire, vous ne faites qu'expliciter le comportement par défaut avec l'option -i.