Comment utiliser la puissante commande Xargs sous Linux [expliqué avec des exemples]

xargs est l’une des commandes les plus puissantes de Linux. Dans ce didacticiel, je vais vous montrer comment utiliser xargs pour convertir l’entrée standard en commandes.

Qu’est-ce que la commande xargs ?

La commande xargs lit des lignes de texte à partir de l’entrée standard ou de la sortie d’une autre commande et les transforme en commandes et les exécute.

Vous trouverez souvent la commande xargs utilisée avec la commande find . La commande find vous donne une liste de noms de fichiers et la commande xargs vous permet d’utiliser ces noms de fichiers, un par un, comme s’ils étaient entrés dans l’autre commande.

Étant donné que xargs fonctionne sur la redirection, je vous recommande vivement de parfaire vos connaissances sur la redirection stdin, stdout et pipe sous Linux .

Comment utiliser la commande xargs ?

La commande xargs a la syntaxe suivante :

xargs [options] [command [initial-arguments]]

Mais vous n’allez probablement pas l’utiliser comme ça. Sa puissance réside dans la combinaison de la sortie d’une commande à une autre. Voyons cela avec un exemple simple.

Dans mon répertoire courant, j’ai quelques fichiers texte et le flowers.txt porte le nom de tous ces fichiers :

abhishek@linuxhandbook:~/tutorial$ ls
flowers.txt  lily.txt  one_lotus.txt  rose.txt  three_lotus.txt  two_lotus.txt
abhishek@linuxhandbook:~/tutorial$ cat flowers.txt 
lily.txt
one_lotus.txt
rose.txt
three_lotus.txt
two_lotus.txt

Maintenant, mon objectif est que je veuille voir la taille de fichier de tous les fichiers mentionnés dans le flowers.txt. Le bon sens dit que je pourrais combiner la commande cat pour afficher tous les noms de fichiers, puis la diriger vers la commande du pour vérifier la taille du fichier .

Mais si je le dirige directement, cela ne donnera pas la taille de chacun des fichiers mentionnés dans le fichier flowers.txt.

abhishek@linuxhandbook:~/tutorial$ du -h
52K	.
abhishek@linuxhandbook:~/tutorial$ cat flowers.txt | du -h
52K	.

Pourquoi? Tout d’abord, la commande du ne prend pas d’entrée standard. Deuxièmement, la sortie de la commande cat n’est pas des noms de fichiers individuels. C’est comme des mots séparés par un caractère de nouvelle ligne.

READ  Top 14 des émulateurs de terminaux pour Linux

La magie de la commande xargs est qu’elle prendra ceci et le texte séparés par des blancs ou de nouvelles lignes et les convertira en entrées individuelles pour la commande suivante.

abhishek@linuxhandbook:~/tutorial$ cat flowers.txt | xargs du -h
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Considérez cela comme équivalent à fournir ces noms de fichiers à la commande du :

abhishek@linuxhandbook:~/tutorial$ du -h lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt 
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Vous réalisez maintenant la puissance de la commande xargs, n’est-ce pas ?

xargs et find : faits l’un pour l’autre

Vous le trouverez souvent utilisé en combinaison avec la “commande de recherche”.

La commande find recherche des fichiers et des répertoires et renvoie leurs noms. Grâce à xargs, vous pouvez utiliser le résultat de la commande find à des fins spécifiques comme les renommer, les déplacer, les supprimer et ainsi de suite.

Supposons que vous souhaitiez obtenir tous les fichiers se terminant par .txt et contenant le mot red. Vous pouvez combiner les commandes find et grep à l’aide de xargs :

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt

La combinaison de commandes find exec fonctionne de la même manière. Mais concentrons-nous sur la commande xargs ici.

Traiter les noms de fichiers avec des espaces

Si vous avez un fichier avec un espace dans son nom, cela causera des problèmes. Disons que j’ai renommé three_lotus.txt en “three lotus.txt”. Désormais, lorsqu’il est traité via xargs, il est considéré comme deux fichiers distincts, trois et lotus.txt.

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./two_lotus.txt
grep: ./three: No such file or directory
grep: lotus.txt: No such file or directory
./rose.txt

Dans de tels cas, vous devez utiliser l’option -print0 de la commande find. Il sépare les lignes avec des caractères nuls ASCII au lieu de caractères de saut de ligne. De même, vous devez également utiliser xargs avec -0 pour accepter les valeurs nulles ASCII.

abhishek@linuxhandbook:~/tutorial$ find . -type f -print0 -name "*.txt" | xargs -0 grep -l red
./two_lotus.txt
./three lotus.txt
./rose.txt

Voir quelle commande est en cours d’exécution

Si vous voulez voir quelle commande est exécutée à l’aide de xargs, vous pouvez utiliser l’option -t. Il imprimera la commande réelle en cours d’exécution.

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs -t touch
touch ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt

Forcer xargs à demander une confirmation avant d’exécuter la commande

Certaines situations exigent une attention particulière, comme la suppression de fichiers. Ce sera une bonne idée de voir quelle commande va être exécutée et d’avoir la possibilité de refuser l’exécution.

READ  KDE vs GNOME : Quel est le choix ultime de bureau Linux ?

Vous pouvez utiliser l’option -p de xargs pour obtenir l’invite.

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs -p rm
rm ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...n

Utiliser un espace réservé avec xargs pour mieux le contrôler

Par défaut, la commande xargs ajoute l’entrée standard comme argument à la fin de la commande. Cela crée un problème lorsque vous devez l’utiliser avant le dernier argument.

Par exemple, si vous utilisez la commande move , vous avez d’abord besoin de la source, puis de la cible. Si vous souhaitez déplacer les fichiers trouvés vers un répertoire cible, cette commande ne fonctionnera pas :

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs -p mv new_dir
mv new_dir ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...y
mv: target './rose.txt' is not a directory

C’est ici que vous pouvez utiliser des espaces réservés dans xargs avec l’option -I like this :

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs -p -I {} mv {} new_dir
mv ./three_lotus.txt new_dir ?...n
mv ./two_lotus.txt new_dir ?...n
mv ./lily.txt new_dir ?...n
mv ./rose.txt new_dir ?...n

Pensez-y comme si xargs récupérait tous les noms de fichiers à partir de la commande find et les conservait dans {}. Ensuite, il passe à la commande mv et fournit le contenu de {}.

La principale différence ici est qu’au lieu de mettre tous les noms de fichiers dans la même commande, elle les ajoute un par un. C’est pourquoi la commande mv a été appelée pour chaque argument (comme vous pouvez le voir dans l’exemple ci-dessus).

Remarque : J’ai utilisé {} comme espace réservé. Vous pouvez utiliser la plupart des autres lettres ou caractères comme espace réservé. {} est une valeur sûre et facile à comprendre et à distinguer.

READ  11 astuces pour accélérer Ubuntu Linux

Exécuter plusieurs commandes avec xargs

Vous pouvez utiliser les espaces réservés pour exécuter plusieurs commandes avec xargs.

abhishek@linuxhandbook:~/tutorial$ find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}' 
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./three_lotus.txt
0	./three_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./two_lotus.txt
0	./two_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./lily.txt
0	./lily.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./rose.txt
0	./rose.txt

Gardez à l’esprit que l’espace réservé ne s’étendra pas à la prochaine redirection de canal ou à une autre commande. C’est pourquoi j’ai utilisé la commande sh ici.

Il y a toujours plus…

J’ai principalement utilisé la commande find avec xargs dans les exemples ici car c’est ce que vous verrez le plus. Mais cela ne signifie pas que xargs est limité à être utilisé avec la commande find uniquement. Un exemple pratique de la commande xargs est lorsque vous souhaitez arrêter tous les conteneurs docker en cours d’exécution :

docker ps -q | xargs docker stop

Comme la plupart des autres commandes Linux, il existe également de nombreuses autres options avec xargs. Vous pouvez toujours vous référer à la page de manuel de la commande xargs pour plus d’informations.

Je pense que les exemples de commandes xargs répertoriés ici sont suffisants pour vous donner une bonne compréhension de cette commande géniale.

Si vous avez des questions ou des suggestions, n’hésitez pas à me le faire savoir dans la section des commentaires.

5/5 - (1 vote)
SAKHRI Mohamed
SAKHRI Mohamed

Le blog d'un passionné d'informatique qui partage des actualités, des tutoriels, des astuces, des outils en ligne et des logiciels pour Windows, macOS, Linux, Web designer et jeux vidéo.

Publications: 3732

Laisser un commentaire

Your email address will not be published.