GNU/Linux >> Tutoriels Linux >  >> Linux

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 actuel, j'ai des fichiers texte et le flowers.txt porte le nom de tous ces fichiers :

[email protected]:~/tutorial$ ls
flowers.txt  lily.txt  one_lotus.txt  rose.txt  three_lotus.txt  two_lotus.txt
[email protected]:~/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.

[email protected]:~/tutorial$ du -h
52K	.
[email protected]:~/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.

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.

[email protected]:~/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 :

[email protected]:~/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 telles que les renommer, les déplacer, les supprimer, etc.

Disons que vous voulez obtenir tous les fichiers se terminant par .txt et contenant le mot rouge. Vous pouvez combiner les commandes find et grep à l'aide de xargs :

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt

Traitement des 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.

[email protected]:~/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.

[email protected]:~/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.

[email protected]:~/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.

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

[email protected]:~/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 :

[email protected]:~/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 :

[email protected]:~/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.

Exécuter plusieurs commandes avec xargs

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

[email protected]:~/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 parce que 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 tel 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.


Linux
  1. Comment utiliser la commande Linux grep

  2. Quelle commande sous Linux [expliqué avec des exemples]

  3. Comment utiliser la commande id sous Linux

  4. Comment utiliser la commande "screen" sous Linux

  5. Comment utiliser les expressions régulières avec la commande cp sous Linux ?

Comment utiliser la commande top sous Linux

Comment utiliser la commande Linux Ping

Comment utiliser la commande fd sur le système Linux

Comment utiliser la commande wget sous Linux ?

Comment utiliser la commande xargs sous Linux ?

Comment utiliser la commande RPM sous Linux