Option xargs -I

12

Le manuel de xargs dit:

-I replace-str
--replace [= replace-str]
-i [replace-str]
Remplace les occurrences de replace-str dans les arguments initiaux par des noms lus à partir de l'entrée standard.

Je ne comprends pas cette partie: with names read from standard input.

Par exemple, ce qui se passe avec:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

Le morceau de code ci-dessus compte le nombre total de fichiers / répertoires dans un répertoire.

Quelqu'un pourrait-il m'expliquer cela?

sjsam
la source

Réponses:

20

"avec des noms lus à partir de l'entrée standard" signifie que xargsprend les données entrant sur son entrée standard, les divise et les utilise pour exécuter la commande donnée dans ses arguments. Par défaut, il se fractionne sur les blancs ou les sauts de ligne et s'exécute echoavec autant d'arguments que possible.

L' -0option de votre exemple indique xargsde diviser son entrée sur des octets nuls au lieu de blancs ou de sauts de ligne. Combiné avec finddes -print0, cela permet de gérer correctement les noms de fichiers contenant des blancs ou des nouvelles lignes.

L' -Ioption change la façon dont les nouvelles lignes de commande sont construites. Au lieu d'ajouter autant d'arguments que possible à la fois, xargsprendra un nom à la fois de son entrée, recherchez le jeton donné ( {}ici) et remplacez-le par le nom.

Dans votre exemple, {}n'est pas présent dans le modèle de commande donné à xargs, donc est en xargsfait chargé de s'exécuter echosans argument, une fois pour chaque nom de fichier qui lui est donné par find. Pour voir cela, déposez le wc:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

Vous verrez une série de lignes vides ... Comparez cela avec

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

et

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

et

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

pour mieux comprendre.

Stephen Kitt
la source