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.