Commande xargs : utilisation, options -n et -I et combinaison avec find

Environnement de testFamille RHELAlmaLinux 9.8Compte rootVérifié le 2026-10-29

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

  • ↪️ L'entrée standard comme arguments de commande

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.txt
alice
bob
carol
dave
erin

Si 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 echo
alice bob carol dave erin

Si vous n'écrivez aucune commande ensuite, xargs exécute echo : le résultat est donc le même.

cat names.txt | xargs
alice bob carol dave erin

Un 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.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Avec 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 total

2️⃣ Les options -n et -I de xargs

  • ↪️ Taille des groupes, position de l'argument et vérification avec -t

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.

🧩 Comment xargs regroupe l'entrée standard en arguments de commande
Schéma explicatif
⚙️ Option
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Entrée standard (names.txt)alicebobcaroldaveerinUn nom par ligne, cinq lignes.
② Regrouper en argumentsalicebobcaroldaveerinSans option, les cinq forment un seul groupe.alicebobcaroldaveerin-n 2 regroupe par deux et place le reste dans un groupe à part.alicebobcaroldaveerin-I {} fait d'une ligne un groupe et la place à l'endroit de {}.
③ Commandes exécutées et sortieecho alice bob carol dave erinalice bob carol dave erinecho s'exécute une fois.echo alice bobecho carol daveecho erinecho s'exécute trois fois, avec une ligne par groupe.echo 'user: alice' echo 'user: bob' … cinq fois sous la même forme jusqu'à erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho s'exécute cinq fois, avec un nom à la place de {}.
Sans option, xargs ajoute tous les mots lus sur l'entrée comme arguments d'une seule exécution. Les cinq noms vont à un seul echo et s'affichent sur une ligne.
Avec -n 2, les mots sont regroupés par deux et la commande est répétée. Les cinq noms forment trois groupes : echo s'exécute donc trois fois.
Avec -I {}, une ligne compte comme une unité et prend la place de {} dans la commande, exécutée pour chaque ligne. C'est utile quand un argument doit se trouver ailleurs qu'à la fin.

-n 1 exécute echo pour chaque nom, ce qui affiche cinq lignes.

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2 regroupe par deux et passe le reste à part.

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

Pour 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 echo
echo alice bob
alice bob
echo carol dave
carol dave
echo erin
erin

Si 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: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

De 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 home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  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 echo
alice bob
carol dave
erin

3️⃣ Combiner find et xargs

  • ↪️ Passer des noms de fichiers avec espaces grâce à -print0 et -0

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.log

Quand 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 total

L'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 total

Pour 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.log

4️⃣ Supprimer des fichiers avec la commande xargs

  • ↪️ Prévisualiser avec echo et confirmer avec -p

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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Avec -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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Si vous saisissez y, les trois fichiers sont supprimés et seul keep.txt reste.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

Si 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 rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Exécution parallèle, séparateurs et options de xargs

  • ↪️ Les options -P, -d et -a

🔲 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.003s
time seq 1 4 | xargs -n 1 -P 4 sleep

real	0m4.005s
user	0m0.001s
sys	0m0.006s

Si 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 echo
alice
bob
carol

Pour 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 echo
alice bob carol dave erin

🔲 Options de la commande xargs

📌 Options principales : résultats de cet article

OptionRôleRésultat dans cet article
-nFixe le nombre d'arguments passés à une exécution de la commandeLes cinq noms sont regroupés par deux avec -n 2 et echo s'exécute trois fois
-IPlace chaque ligne dans le caractère de remplacement et exécute par ligneUn nom prend la place de {} ; écrit avec -n, -I est ignoré avec un avertissement
-LFixe le nombre de lignes passées à une exécution de la commandeDans un fichier à un nom par ligne, même résultat que -n 2
-tAffiche d'abord la ligne de commande à exécuterLa ligne de commande s'affiche avant la sortie
-0Dé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
-pDemande s'il faut exécuter chaque commanden les laisse en place ; y supprime les trois fichiers
-rN'exécute pas la commande si l'entrée est videSans elle, [rm: missing operand] ; avec elle, rien ne s'exécute
-PFixe le nombre de commandes exécutées en même tempsQuatre sleep : 10 secondes à la suite, 4 secondes avec -P 4
-dFixe le séparateur qui découpe l'entrée-d , donne une ligne par nom
-aLit l'entrée depuis un fichier au lieu de l'entrée standardLes cinq noms de names.txt vont à un seul echo

📎 Autres options : selon le manuel officiel

OptionRôle
-sFixe le nombre maximal de caractères d'une ligne de commande
-xAu-delà de la taille -s, se termine sans exécuter
-ECesse de lire l'entrée en arrivant à une ligne contenant uniquement ce texte
-oRouvre le terminal comme entrée standard de la commande (pour les programmes interactifs)
--process-slot-varPlace 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.

Simulateur de la commande xargsGNU findutils 4.8
[root@server work]#
Les touches ↑↓ rappellent les commandes saisies auparavant.

🔢 FAQ & contenus recommandés

Si vous passez un numéro de processus, kill envoie un signal à ce numéro. En récupérant avec la variable du shell $! le numéro d'un sleep 600 lancé en arrière-plan et en le passant à xargs kill, [Terminated sleep 600] est resté dans la liste des tâches et la tâche a disparu au jobs suivant. Quand vous réunissez des numéros avec une autre commande, affichez d'abord les processus concernés avant de les passer.

L'option --show-limits affiche les limites. Sur le serveur testé, la limite POSIX de longueur de ligne de commande était de 2,093,890 octets, et le tampon de commande réellement utilisé par xargs de 131,072 octets. D'après le manuel, si l'entrée dépasse ce tampon, xargs répartit la commande sur plusieurs exécutions.

Si au moins une commande lancée par xargs échoue avec un code de 1 à 125, le code de sortie de xargs est 123. Le wc au nom de fichier coupé et le rm à entrée vide ont tous deux donné 123, et une commande introuvable a donné 127. Basez-vous sur ces valeurs pour vérifier le code de sortie après xargs dans vos scripts shell.

ℹ️ 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 5   +   7   =