ce qui est diff bentween xargs avec accolades et sans sous Linux

18

Je veux savoir quelle est la différence entre cela

ls | xargs rm

ls | xargs -i{} rm {}

Les deux travaillent pour moi


la source

Réponses:

19

xargs rminvoquera rmavec tous les arguments comme paramètre quitté avec des espaces.

xargs -i{} rm {}sera invoqué rm {}pour chacun des arguments et {}sera remplacé par l'argument actuel.

Si vous avez 2 arguments a.txtet b.txt, xargs rm appellera cela

rm a.txt b.txt

Mais xargs -i{} rm {}appellera

rm a.txt
rm b.txt

C'est parce que l' -ioption implique l' -L 1option qui signifie que la commande rmne prendra que la 1ligne à chaque fois. Et ici, chaque ligne ne contient qu'un seul argument.

Consultez ce lien Ideone pour en savoir plus.

Shiplu Mokaddim
la source
QUI EST MIEUX
1
@ user19140477031 dépend de quelle opération vous effectuez. car rmcela n'a pas d'importance
Shiplu Mokaddim
3

Avec les accolades, il engendrera un rmprocessus par fichier. Sans les accolades, xargspassera autant de noms de fichiers que possible à chaque rmcommande.

Comparer

ls | xargs echo

et

ls | xargs -i echo '{}'
kmkaplan
la source
2

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 d'entrée entière. 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 expliquez simplement le comportement par défaut avec l'option -i.

aag
la source