Commande xargs : utilisation, options -n et -I et combinaison avec find
La commande xargs est un outil Linux qui transforme les lignes et les mots reçus sur l'entrée standard en arguments d'une autre commande, puis l'exécute. En passant à wc avec xargs trois fichiers journaux trouvés par find dans un dossier de travail d'un serveur AlmaLinux 9, un fichier dont le nom contenait une espace a été coupé en deux et a provoqué une erreur, et avec -print0 et -0, le nombre de lignes des trois fichiers s'est affiché.
Les sorties ci-dessous ont été obtenues dans un dossier de travail avec le compte root d'un serveur AlmaLinux 9.8. La liste de noms, les journaux et les fichiers temporaires sont des fichiers d'exemple créés pour le test, et les adresses IP et chemins de dossiers qu'ils contiennent sont aussi des valeurs d'exemple.
1️⃣ Utilisation de base de la commande xargs
xargs découpe l'entrée standard transmise par la commande précédente selon les espaces et les sauts de ligne, puis exécute la commande écrite ensuite avec ces éléments comme arguments. Nous l'avons vérifié avec names.txt, qui contient un nom par ligne.
cat names.txtalice
bob
carol
dave
erinSi vous passez la sortie de cat à xargs echo, les cinq lignes deviennent les arguments d'un seul echo et s'affichent sur une ligne.
cat names.txt | xargs echoalice bob carol dave erinSi vous n'écrivez aucune commande ensuite, xargs exécute echo : le résultat est donc le même.
cat names.txt | xargsalice bob carol dave erinUn tube relie la sortie de la commande précédente à l'entrée standard de la suivante : rien n'entre donc dans les arguments de la commande suivante. Si vous passez seulement par tube list.txt, qui contient trois noms de fichiers, à wc -l, wc compte les 3 lignes de la liste elle-même.
cat list.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Avec xargs entre les deux, les trois noms de la liste deviennent des arguments de wc et le nombre de lignes s'affiche pour chaque fichier.
cat list.txt | xargs wc -l 3 logs/access.log
2 logs/error.log
1 tmp/keep.txt
6 total2️⃣ Les options -n et -I de xargs
Sans option, toute l'entrée va dans une seule exécution de la commande. Pour répéter la commande, fixez avec -n le nombre d'arguments passés à chaque fois. La figure ci-dessous montre comment les mêmes cinq noms sont regroupés selon l'option.
-n 1 exécute echo pour chaque nom, ce qui affiche cinq lignes.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 regroupe par deux et passe le reste à part.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinPour voir les commandes exécutées, ajoutez -t. La ligne de commande s'affiche d'abord, puis sa sortie en dessous.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinSi un argument doit se trouver ailleurs qu'à la fin de la commande, fixez un caractère de remplacement avec -I. Chaque ligne prend la place de {}, et si le même texte apparaît plusieurs fois, tous sont remplacés.
cat names.txt | xargs -I {} echo 'user: {}'user: alice
user: bob
user: carol
user: dave
user: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinDe la même façon, vous pouvez créer un dossier par nom. Créez d'abord le dossier home, puis utilisez -I {} pour créer dedans un dossier par nom : cinq dossiers apparaissent.
mkdir homecat names.txt | xargs -I {} mkdir home/{}ls homealice bob carol dave erin-I traite une ligne comme un seul argument et ne peut donc pas s'utiliser avec -n. Quand nous avons écrit les deux, -I a été ignoré avec un avertissement et {} s'est affiché tel quel.
cat names.txt | xargs -I {} -n 2 echo {}xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin-L regroupe par nombre de lignes. Si une ligne contient plusieurs mots, ils sont passés ensemble, et avec names.txt, à un nom par ligne, -L 2 a donné le même résultat que -n 2.
cat names.txt | xargs -L 2 echoalice bob
carol dave
erin3️⃣ Combiner find et xargs
Inutile de créer une liste de noms à la main : vous pouvez passer directement à xargs les fichiers trouvés par find. La recherche des fichiers finissant par .log dans le dossier des journaux en trouve trois, dont un avec une espace dans son nom.
find /root/work/logs -name '*.log'/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.logQuand cette liste est passée telle quelle à xargs wc -l, le nom avec espace s'est coupé en old et access.log, deux lignes d'erreur sont apparues et le total n'était que de 5 lignes, pour deux fichiers.
find /root/work/logs -name '*.log' | xargs wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
5 total-print0 de find sépare les noms par le caractère nul au lieu du saut de ligne, et -0 de xargs découpe les arguments uniquement sur ce caractère nul. Avec les deux, le nombre de lignes des trois fichiers s'affiche, y compris celui avec une espace.
find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalL'option -exec de find fait le même travail. Avec + après {}, les fichiers trouvés sont passés en une fois, le résultat est donc identique, et find transmet tels quels les espaces des noms. xargs accepte aussi la sortie d'autres commandes : utilisez-le quand l'entrée ne vient pas uniquement de find, ou quand vous devez fixer le nombre passé à chaque fois (-n) ou le nombre d'exécutions simultanées (-P).
find /root/work/logs -name '*.log' -exec wc -l {} + 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalPour ne garder que les fichiers trouvés contenant une chaîne, ajoutez grep -l après xargs. Deux fichiers contenaient wp-login : le journal d'accès et le journal d'erreurs.
find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login/root/work/logs/access.log
/root/work/logs/error.log4️⃣ Supprimer des fichiers avec la commande xargs
Avec rm après xargs, les fichiers trouvés sont supprimés en une fois : vérifiez donc d'abord quels fichiers seront passés. Avec echo devant rm, seule la ligne de commande qui serait exécutée s'affiche et les fichiers restent en place.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmpls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtAvec -p, xargs demande s'il faut exécuter chaque commande. Si vous saisissez n, rien n'est supprimé et les trois fichiers temporaires restent.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...nls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtSi vous saisissez y, les trois fichiers sont supprimés et seul keep.txt reste.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtSi l'entrée est vide, xargs exécute la commande une fois sans argument. Avec un fichier vide, rm s'exécute sans argument et donne l'erreur [rm: missing operand] ; avec -r, la commande ne s'exécute pas du tout.
cat empty.txt | xargs rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Exécution parallèle, séparateurs et options de xargs
🔲 Exécution parallèle et séparateurs
Quand les commandes s'exécutent l'une après l'autre, le temps augmente avec le nombre de cibles. -P fixe le nombre de commandes exécutées en même temps. Quatre sleep de 1, 2, 3 et 4 secondes ont pris 10 secondes à la suite, et se sont terminés en 4 secondes, la plus longue, en même temps avec -P 4.
time seq 1 4 | xargs -n 1 sleep
real 0m10.007s
user 0m0.004s
sys 0m0.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sSi l'entrée est découpée par un symbole autre que le saut de ligne ou l'espace, fixez le séparateur avec -d. En découpant avec -d , trois noms reliés par des virgules, une ligne s'affiche par nom.
printf 'alice,bob,carol' | xargs -d , -n 1 echoalice
bob
carolPour lire depuis un fichier au lieu de l'entrée standard, indiquez son nom à -a. Les cinq noms de names.txt sont passés à echo sans tube.
xargs -a names.txt echoalice bob carol dave erin🔲 Options de la commande xargs
📌 Options principales : résultats de cet article
| Option | Rôle | Résultat dans cet article | |
|---|---|---|---|
| -n | Fixe le nombre d'arguments passés à une exécution de la commande | Les cinq noms sont regroupés par deux avec -n 2 et echo s'exécute trois fois | |
| -I | Place chaque ligne dans le caractère de remplacement et exécute par ligne | Un nom prend la place de {} ; écrit avec -n, -I est ignoré avec un avertissement | |
| -L | Fixe le nombre de lignes passées à une exécution de la commande | Dans un fichier à un nom par ligne, même résultat que -n 2 | |
| -t | Affiche d'abord la ligne de commande à exécuter | La ligne de commande s'affiche avant la sortie | |
| -0 | Découpe l'entrée uniquement sur le caractère nul (avec find -print0) | Sans elle, les noms avec espace sont coupés et deux lignes d'erreur s'affichent ; avec elle, les trois fichiers donnent 6 lignes | |
| -p | Demande s'il faut exécuter chaque commande | n les laisse en place ; y supprime les trois fichiers | |
| -r | N'exécute pas la commande si l'entrée est vide | Sans elle, [rm: missing operand] ; avec elle, rien ne s'exécute | |
| -P | Fixe le nombre de commandes exécutées en même temps | Quatre sleep : 10 secondes à la suite, 4 secondes avec -P 4 | |
| -d | Fixe le séparateur qui découpe l'entrée | -d , donne une ligne par nom | |
| -a | Lit l'entrée depuis un fichier au lieu de l'entrée standard | Les cinq noms de names.txt vont à un seul echo |
📎 Autres options : selon le manuel officiel
| Option | Rôle | |
|---|---|---|
| -s | Fixe le nombre maximal de caractères d'une ligne de commande | |
| -x | Au-delà de la taille -s, se termine sans exécuter | |
| -E | Cesse de lire l'entrée en arrivant à une ligne contenant uniquement ce texte | |
| -o | Rouvre le terminal comme entrée standard de la commande (pour les programmes interactifs) | |
| --process-slot-var | Place un numéro différent dans une variable d'environnement pour chaque commande simultanée |
🔲 Simulateur de la commande xargs
Dans le simulateur ci-dessous, vous pouvez saisir vous-même des commandes xargs et find sur les mêmes fichiers de test.
🔢 FAQ & contenus recommandés
Recherche de chaînes
Commande grep sous Linux
La commande grep trouve dans les fichiers les lignes correspondant à des chaînes et à des expressions régulières. Utilisez-la pour chercher en une fois dans plusieurs fichiers passés par xargs.
Supprimer des fichiers
Commande Linux rm
Un article sur la commande rm, qui supprime fichiers et dossiers, et sur les dangers de l'option -rf. Vérifiez les options avant de placer rm après xargs.
Terminer des processus
Commande Linux kill
La commande kill envoie un signal à un numéro de processus pour le terminer. Utilisez-la ensuite quand vous passez une liste de numéros de processus par xargs pour les arrêter.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.