xargs

La commande xargs est un petit outil extrêmement pratique pour chaîner des commandes qui prennent des arguments comme entrée.

Voyons un petit exemple pour comprendre son intérêt. Imaginez que vous deviez supprimer tout les fichiers qui se terminent par .conf, mais pas les fichier qui se terminent par .old.conf.

La première idée est d'utiliser find pour extraire tout les fichiers qui se terminent par .conf:

$ find . -name '*.conf'
./com.ikipou.lingua/settings.conf
./com.ikipou.lingua/settings.old.conf
./com.linuxcertif/settings.conf
./com.linuxcertif/settings.old.conf

Ensuite on filtre la sortie avec grep pour exclure les .old.conf:

$ find . -name '*.conf' | grep -v '\.old\.conf'
./com.ikipou.lingua/settings.conf
./com.linuxcertif/settings.conf

Ce qui donne à la sortie la liste de mes fichiers. Le problème est que je ne peux pas chaîner la commande avec rm:

$ find . -name '*.conf' | grep -v '\.old\.conf' | rm
rm: missing operand
Try `rm --help' for more information.

Pourquoi? Parce que rm attend les noms de fichiers à supprimer comme argument, rm ne lit pas l'entrée standard.

Et c'est ici que xargs nous sauve la vie. Avec xargs, vous donnez une commande, et tout ce qui est passé à l'entrée standard sera passé en une fois comme argument de la commande. Ce qui fait que la commande suivante réglera le problème, impressionnera votre patron, et la secrétaire du bureau d'à coté (ou le mec canon qui répare l'ascenseur pour nos lectrices):

find . -name '*.conf' | grep -v '\.old\.conf' | xargs rm

Utilisation

Revenons sur l'utilité de la commande, xargs prend en argument une commande, des paramètres initiaux, et lit l'entrée standard. Tout ce qui est lu par xargs sur l'entrée standard est passé comme argument à la commande.

Si je tape:

$ xargs echo
Linux
Certif
(ensuite Ctrl-D pour fermer l'entrée standard),

La commande echo est exécuté avec les arguments Linux et Certif, elle équivaut ici à

echo Linux Certif

Page de manuel

Les chances sont faibles que vous ayez besoin de plus que ce que je viens de montrer. Pour certains cas tordus complexes, xargs peut quand même être utile. Vous verrez dans la page de manuel de xargs qu'il y a des options intéressante pour préciser des délimiteurs et autres truc bien pratiques.