Aller au contenu
Administration Linux medium

xargs : construire des commandes à partir d'entrées

30 min de lecture

Quand on doit exécuter une commande sur des centaines de fichiers trouvés par find, traiter une liste depuis un fichier ou éviter l'erreur "argument list too long", xargs est l'outil indispensable. Simple et puissant, xargs transforme l'entrée standard en arguments pour une autre commande, permettant de chaîner les commandes efficacement.

  • Transformer stdin en arguments pour une commande
  • Limiter le nombre d'arguments avec -n
  • Positionner les arguments avec -I
  • Gérer les noms de fichiers avec espaces (-0)
  • Exécuter des commandes en parallèle avec -P

xargs fait partie des commandes de pipeline sous Linux. Chaque outil a sa spécialité :

CommandeSpécialitéQuand l'utiliser
xargsTransformer stdin en argumentsExécuter une commande sur une liste
findRechercher des fichiersTrouver par nom, taille, date
grepFiltrer des lignesRechercher des patterns
parallelExécution parallèle avancéeJobs complexes, machines distantes
teeDupliquer un fluxÉcrire et afficher simultanément
xargs -PParallélisme simpleJobs locaux en parallèle

Quand utiliser xargs vs find -exec ?

Situationxargsfind -exec
Performance (moins de forks)Oui, find | xargs cmdNon, Fork par fichier
Fichiers avec espacesNécessite -print0 | xargs -0Géré automatiquement
Exécution parallèleOui, -P NNon
Syntaxe simpleOuiOui
Sans pipeNonOui, -exec cmd {} \;

Combinaisons fréquentes :

Fenêtre de terminal
# find + xargs : supprimer des fichiers (sécurisé)
find . -name "*.tmp" -print0 | xargs -0 rm
# grep + xargs : agir sur les fichiers contenant un motif
grep -rl "TODO" src/ | xargs -I {} echo "À traiter: {}"
# cat + xargs : exécuter sur une liste depuis fichier
cat urls.txt | xargs -P 4 -I {} curl -O {}
# ls + xargs : renommer en masse
ls *.bak | xargs -I {} mv {} {}.old

🧠 Modèle mental — Comment fonctionne xargs

xargs = Lire stdin → Découper en arguments → Exécuter la commande avec ces arguments

Modèle mental xargs : stdin → découpage → arguments → commande cible

Points clés

  • xargs lit stdin et transforme chaque élément en argument
  • Par défaut, xargs utilise espaces et retours à la ligne comme séparateurs
  • Sans commande spécifiée, xargs utilise echo par défaut
  • -n limite le nombre d'arguments par exécution
  • -I {} permet de positionner l'argument où on veut
  • -0 avec find -print0 gère les noms de fichiers avec espaces

Règles d'or

1
Toujours utiliser -print0 / -0 avec find Les noms de fichiers peuvent contenir des espaces ou caractères spéciaux
2
Tester avec echo ou -p avant d'exécuter Évite les erreurs destructives avec rm, mv, etc.

Vocabulaire essentiel

-n N
Maximum N arguments par commande
-I {}
Remplacer {} par chaque argument
-0
Séparateur null (avec find -print0)
-p
Demander confirmation avant exécution
-t
Afficher la commande avant exécution
-r
Ne pas exécuter si stdin est vide
📚 Pour aller plus loin — 6 options avancées
-P N
Exécuter N commandes en parallèle
-L N
Maximum N lignes par commande
-a fichier
Lire depuis un fichier au lieu de stdin
-d delim
Utiliser delim comme séparateur
--max-procs
Alias de -P
--no-run-if-empty
Alias de -r

xargs lit stdin, découpe par espaces ou retours à la ligne, puis passe les éléments comme arguments à la commande spécifiée.

Retenez l'ordre de lecture : ce qui est à gauche du pipe produit du texte, ce qui est à droite de xargs reçoit ce texte sous forme d'arguments. Toutes les options se placent entre xargs et la commande cible ; une option écrite après la commande cible lui serait transmise telle quelle, ce qui provoque des erreurs difficiles à lire.

Fenêtre de terminal
commande_source | xargs [OPTIONS] commande_cible

Ce tableau sert de grille de diagnostic : quand un enchaînement ne donne pas le résultat attendu, identifiez d'abord à quelle étape ça casse. Neuf fois sur dix le problème se situe à l'étape 3, le découpage de l'entrée, et pas dans la commande cible que l'on accuse spontanément.

ÉtapeDescriptionExemple
1. SourceGénère une listefind . -name "*.log"
2. PipeTransmet à xargs|
3. xargsDécoupe et regroupexargs
4. CibleReçoit les argumentsrmrm f1.log f2.log f3.log

Deux comportements par défaut méritent d'être connus avant tout usage sérieux. D'abord, sans commande cible, xargs appelle echo : c'est ce qui en fait un outil de prévisualisation immédiat. Ensuite, xargs regroupe le maximum d'arguments dans un seul appel plutôt que d'appeler la commande une fois par élément ; c'est ce regroupement qui donne son gain de performance et qui évite l'erreur Argument list too long.

Fenêtre de terminal
# Sans commande : xargs utilise echo
echo "a b c" | xargs
# Sortie : a b c
# Avec commande : passe tous les arguments
echo "f1.txt f2.txt" | xargs rm
# Équivalent à : rm f1.txt f2.txt

Sept options couvrent la quasi-totalité des usages. Deux sont des filets de sécurité à réflexe permanent : -0 contre les noms de fichiers exotiques et -r contre l'exécution à vide. Deux servent au débogage avant d'engager une action destructrice : -t et -p. Les trois autres pilotent le découpage et le parallélisme.

OptionEffetExemple
-n NMaximum N arguments par exécutionxargs -n 2
-I {}Utiliser comme placeholderxargs -I {} mv {} {}.bak
-0Séparateur null (avec find -print0)find -print0 | xargs -0
-pDemander confirmationxargs -p rm
-tAfficher la commande (trace)xargs -t echo
-rNe pas exécuter si videxargs -r rm
-P NN processus en parallèlexargs -P 4

Par défaut, xargs passe tous les arguments en une fois. -n limite :

Fenêtre de terminal
# Tous les arguments
echo "1 2 3 4 5 6" | xargs echo
# Sortie : 1 2 3 4 5 6
# 2 arguments par exécution
echo "1 2 3 4 5 6" | xargs -n 2 echo
# Sortie :
# 1 2
# 3 4
# 5 6

Par défaut, xargs ajoute les arguments à la fin. -I {} permet de les positionner :

Fenêtre de terminal
# Sans -I : arguments à la fin
echo "file.txt" | xargs cp /backup/
# → cp /backup/ file.txt (ERREUR !)
# Avec -I : contrôle du placement
echo "file.txt" | xargs -I {} cp {} /backup/{}
# → cp file.txt /backup/file.txt (correct)

Le point que tout le monde rate : -I ne découpe pas sur les espaces mais sur les retours à la ligne. La page de manuel GNU indique que -I implique -L 1, soit une ligne d'entrée par exécution, et non -n 1 (un argument par exécution). La différence est visible immédiatement :

Fenêtre de terminal
printf "a b\nc d\n" | xargs -I {} echo "[{}]"
# [a b]
# [c d] <- 2 exécutions, une par ligne
printf "a b\nc d\n" | xargs -n 1 echo "["
# [ a
# [ b
# [ c
# [ d <- 4 exécutions, une par mot

C'est une bonne nouvelle : -I traite correctement un nom de fichier contenant un espace tant qu'il occupe une ligne entière. Corollaire à connaître, -n et -I sont mutuellement exclusifs : les combiner déclenche l'avertissement options --max-args and --replace/-I/-i are mutually exclusive et le -n est ignoré.

Les noms de fichiers avec espaces cassent xargs par défaut :

Fenêtre de terminal
# INCORRECT : DANGER : "mon fichier.txt" devient 2 arguments
find . -name "*.txt" | xargs rm
# rm essaie de supprimer "mon" et "fichier.txt" séparément !
# CORRECT : SÉCURISÉ : séparateur null
find . -name "*.txt" -print0 | xargs -0 rm
# Gère correctement "mon fichier.txt"

Règle d'or : toujours tester avec echo ou -p d'abord. xargs alimente très souvent rm, mv ou chmod, des commandes sans retour arrière. Les trois lignes ci-dessous forment une progression à respecter dans l'ordre : on regarde, on confirme, puis on exécute. L'étape 1 est la plus utile car elle révèle le découpage réel de l'entrée, c'est-à-dire exactement ce que vous ne voyez pas quand la commande part directement.

Fenêtre de terminal
# 1. Voir ce qui serait exécuté
find . -name "*.tmp" | xargs echo rm
# 2. Demander confirmation
find . -name "*.tmp" | xargs -p rm
# 3. Exécuter (si ok)
find . -name "*.tmp" -print0 | xargs -0 rm

-P N autorise xargs à faire tourner jusqu'à N processus simultanés. Le gain est réel sur les tâches limitées par les entrées-sorties (téléchargement, compression) et quasi nul sur une tâche qui sature déjà un cœur. Prenez comme point de départ le nombre de cœurs retourné par nproc, puis mesurez : au-delà, la contention disque annule le bénéfice.

Une limite à connaître avant de lancer : xargs -P n'ordonne pas les sorties. Les lignes des différents processus arrivent entremêlées sur le terminal, car aucun tampon n'est réservé par processus. Si vous avez besoin d'une sortie lisible, redirigez chaque exécution vers son propre fichier.

Fenêtre de terminal
# Télécharger 4 URLs en parallèle
cat urls.txt | xargs -P 4 -I {} curl -O {}
# Compresser des fichiers en parallèle (4 processus)
find . -name "*.log" -print0 | xargs -0 -P 4 gzip

Ces cinq symptômes couvrent la majorité des tickets liés à xargs. Lisez la colonne du milieu avant celle de droite : la cause est presque toujours un malentendu sur la façon dont xargs a découpé l'entrée, pas un défaut de la commande cible. Les deux premières lignes sont les seules potentiellement destructrices.

ErreurCauseSolution
"No such file" avec espacesDécoupage incorrect-print0 | xargs -0
Commande exécutée sans argumentstdin videAjouter -r
"Argument list too long"Trop de fichiersxargs découpe automatiquement (ou -n)
non remplacéOubli de -IAjouter -I {}
Résultat mélangé en parallèleSorties entremêléesRediriger vers fichiers séparés

Maintenant que vous comprenez la logique de xargs, voici quatorze modèles prêts à l'emploi. Chacun donne sa formule générale et un exemple concret.

Passer une liste comme arguments à une commande. C'est le comportement de base : xargs regroupe tout ce qu'il reçoit et appelle la commande une seule fois, avec tous les éléments en arguments.

Fenêtre de terminal
echo "a b c" | xargs <commande> # formule
echo "file1.txt file2.txt" | xargs rm # exemple
  • commande : la commande qui reçoit les arguments

Traiter une liste de fichiers stockée dans un fichier texte.

Fenêtre de terminal
cat <liste> | xargs <commande> # formule
cat fichiers.txt | xargs rm # exemple
  • liste : fichier texte contenant les éléments à traiter

Exécuter la commande avec un nombre maximal d'arguments.

Fenêtre de terminal
xargs -n N <commande> # formule
echo "1 2 3 4 5 6" | xargs -n 2 echo # exemple
  • -n N : au plus N arguments par exécution

Utiliser l'argument à un emplacement précis de la commande.

Fenêtre de terminal
xargs -I {} <commande avec {}> # formule
ls *.txt | xargs -I {} mv {} {}.bak # exemple
  • -I {} : remplace {} par chaque argument (implique -n 1)

Gérer sans risque les noms de fichiers contenant des espaces.

Fenêtre de terminal
find . -print0 | xargs -0 <commande> # formule
find . -name "*.txt" -print0 | xargs -0 rm # exemple
  • -print0 : find sépare les résultats par un caractère nul
  • -0 : xargs lit ce même séparateur nul

Demander une confirmation avant chaque exécution. Le prompt est lu sur le terminal, pas sur l'entrée standard déjà occupée par le pipe, ce qui explique l'erreur failed to open /dev/tty dans un script non interactif ou une tâche planifiée.

Fenêtre de terminal
xargs -p <commande> # formule
echo "file1 file2" | xargs -p rm # exemple
  • -p : demande y/n avant d'exécuter

Afficher chaque commande avant de l'exécuter. La trace part sur stderr, elle ne pollue donc pas une redirection de la sortie standard vers un fichier : vous pouvez garder -t en production sans altérer le résultat collecté.

Fenêtre de terminal
xargs -t <commande> # formule
echo "1 2 3" | xargs -t -n 1 echo # exemple
  • -t : trace, affiche la commande sur stderr

Ne rien lancer si l'entrée standard est vide. Sans -r, xargs appelle la commande au moins une fois même sans aucun élément, ce qui donne des erreurs parasites avec rm et peut être franchement dangereux avec une commande qui agit sur le répertoire courant par défaut.

Fenêtre de terminal
xargs -r <commande> # formule
find . -name "*.xyz" | xargs -r rm # exemple
  • -r : no-run-if-empty

Lancer plusieurs instances de la commande en même temps.

Fenêtre de terminal
xargs -P N <commande> # formule
cat urls.txt | xargs -P 4 -I {} curl -O {} # exemple
  • -P N : jusqu'à N processus en parallèle

Supprimer les fichiers trouvés par find. C'est l'enchaînement le plus courant et le plus destructeur du guide : testez-le systématiquement en remplaçant rm par echo rm avant de l'exécuter pour de bon.

Fenêtre de terminal
find <chemin> -name "<motif>" -print0 | xargs -0 rm # formule
find /tmp -name "*.tmp" -print0 | xargs -0 rm # exemple
  • Le couple -print0 / -0 rend la suppression sûre

Rechercher du texte dans les fichiers trouvés. L'intérêt par rapport à grep -r est de pouvoir filtrer d'abord sur des critères que grep ne connaît pas : la date, la taille ou le type d'entrée.

Fenêtre de terminal
find . -name "<motif>" -print0 | xargs -0 grep "<texte>" # formule
find . -name "*.py" -print0 | xargs -0 grep "import" # exemple
  • xargs passe toute la liste à grep en une seule commande

Renommer plusieurs fichiers selon un schéma. C'est le cas typique où -I est indispensable, puisque mv attend l'argument à deux endroits : la source et la destination.

Fenêtre de terminal
ls <motif> | xargs -I {} mv {} <nouveau_motif> # formule
ls *.bak | xargs -I {} mv {} {}.old # exemple
  • -I {} permet de réutiliser l'argument deux fois (source et destination)

Archiver les fichiers trouvés par find.

Fenêtre de terminal
find . -name "<motif>" -print0 | xargs -0 tar -czvf <archive> # formule
find . -name "*.log" -print0 | xargs -0 tar -czvf logs.tar.gz # exemple
  • xargs transmet tous les fichiers à tar d'un coup, tant que la liste tient dans un seul lot. Si elle dépasse la taille de la ligne de commande, xargs relance tar sur le lot suivant et écrase l'archive : seul le dernier lot survit. Sur un gros volume, préférez tar --null --files-from=-, qui lit la liste sur l'entrée standard sans découpage.

Appliquer chmod à plusieurs fichiers. Le -type f de find n'est pas un détail : sans lui, chmod +x s'appliquerait aussi aux répertoires, qui ont déjà besoin du bit d'exécution pour être traversés, et vous perdriez la trace de ce que vous avez réellement modifié.

Fenêtre de terminal
find . -type f -name "<motif>" -print0 | xargs -0 chmod <mode> # formule
find . -type f -name "*.sh" -print0 | xargs -0 chmod +x # exemple
  • -type f limite aux fichiers réguliers

Huit erreurs reviennent constamment avec xargs. Plusieurs sont destructrices : xargs enchaîne souvent vers rm.

Fenêtre de terminal
find . -name "*.txt" | xargs rm # INCORRECT : casse sur "mon fichier.txt"

Symptôme : erreur No such file ou fichiers partiellement supprimés. Cause : xargs découpe sur les espaces, mon fichier.txt devient deux arguments.

Fenêtre de terminal
find . -name "*.txt" -print0 | xargs -0 rm # CORRECT : séparateur nul
Fenêtre de terminal
find . -name "*.xyz" | xargs rm # INCORRECT : exécute "rm" même sans aucun fichier

Symptôme : message d'erreur ou comportement inattendu. Cause : xargs lance la commande même quand l'entrée est vide.

Fenêtre de terminal
find . -name "*.xyz" | xargs -r rm # CORRECT : -r : ne rien faire si vide
Fenêtre de terminal
cat liste.txt | xargs rm # INCORRECT : suppression immédiate, irréversible

Symptôme : des fichiers supprimés par erreur. Cause : aucune vérification avant l'exécution.

Fenêtre de terminal
cat liste.txt | xargs echo rm # CORRECT : prévisualiser, puis xargs -p rm
Fenêtre de terminal
find / -type f | xargs ls # INCORRECT : "Argument list too long" possible

Symptôme : erreur Argument list too long. Cause : le système limite la taille totale des arguments.

Fenêtre de terminal
find / -type f -print0 | xargs -0 -n 1000 ls # CORRECT : xargs découpe en lots
Fenêtre de terminal
ls *.txt | xargs mv {} backup/ # INCORRECT : {} pris au sens littéral

Symptôme : erreur de syntaxe, {} non remplacé. Cause : le placeholder {} n'est actif que si -I est déclaré.

Fenêtre de terminal
ls *.txt | xargs -I {} mv {} backup/ # CORRECT : -I active le placeholder
Fenêtre de terminal
xargs -P 4 commande # INCORRECT : les sorties des 4 processus s'entremêlent

Symptôme : les lignes des différents processus sont mélangées. Cause : aucune synchronisation de la sortie entre processus parallèles.

Fenêtre de terminal
xargs -P 4 -I {} sh -c 'commande {} > {}.out' # CORRECT : une sortie par fichier
Fenêtre de terminal
echo "a b" "c d" | xargs -n 1 # INCORRECT : donne 4 arguments, pas 2

Symptôme : le regroupement voulu disparaît, on obtient quatre éléments au lieu de deux. Cause : contrairement à ce qu'on lit souvent, xargs respecte les guillemets présents dans son entrée. Le coupable est le shell, qui supprime les guillemets avant même qu'echo n'écrive quoi que ce soit : xargs reçoit a b c d, sans aucune marque de regroupement. Preuve par l'exemple, si les guillemets atteignent réellement xargs, ils sont honorés :

Fenêtre de terminal
printf '%s\n' '"a b" "c d"' | xargs -n 1 # affiche 2 lignes : a b, puis c d

En pratique on ne compte pas sur ce mécanisme, parce que -0 et -d désactivent le traitement des guillemets. Le séparateur explicite reste la méthode fiable :

Fenêtre de terminal
printf "a b\0c d" | xargs -0 -n 1 # CORRECT : séparateur nul, aucune ambiguïté
Fenêtre de terminal
ls | xargs -I {} echo {} | wc -l # INCORRECT : le pipe sort du périmètre de xargs

Symptôme : le pipe s'applique à la sortie de xargs, pas à chaque élément. Cause : -I capture tout ce qui suit comme une seule commande.

Fenêtre de terminal
ls | xargs -I {} sh -c 'echo {} | wc -c' # CORRECT : sh -c encapsule le pipe

Rien ne remplace la pratique. Créez l'environnement de test ci-dessous, puis déroulez les douze étapes. À la fin, nettoyez avec rm -rf ~/xargs-lab.

Ce script crée une arborescence dans ~/xargs-lab : des documents (dont certains avec des espaces dans le nom), des images, des logs et des listes à traiter.

Fenêtre de terminal
# Créer le lab
mkdir -p ~/xargs-lab/documents ~/xargs-lab/images ~/xargs-lab/logs
cd ~/xargs-lab
# Fichiers avec noms simples
echo "Contenu fichier 1" > documents/rapport.txt
echo "Contenu fichier 2" > documents/notes.txt
echo "Contenu fichier 3" > documents/todo.txt
# Fichiers avec espaces dans le nom (cas problématique)
echo "Fichier avec espace" > "documents/mon rapport.txt"
echo "Autre fichier" > "documents/mes notes importantes.txt"
# Fichiers images
touch images/photo1.jpg images/photo2.jpg images/photo3.png
touch "images/vacances été.jpg"
# Fichiers de log
for i in {1..5}; do
echo "Log entry $i - $(date)" > logs/app$i.log
done
# Liste de fichiers à traiter
cat > fichiers.txt << 'EOF'
documents/rapport.txt
documents/notes.txt
documents/todo.txt
EOF
# Fichier avec URLs
cat > urls.txt << 'EOF'
https://example.com/page1
https://example.com/page2
https://example.com/page3
EOF
echo "Correct : Lab créé dans ~/xargs-lab"
ls -laR ~/xargs-lab

Déroulez-les dans l'ordre : chaque étape réutilise ce que la précédente a produit. Les quatre premières restent inoffensives, les suivantes touchent à des fichiers réels du lab. Après chaque commande, comparez la sortie obtenue à la phrase d'explication qui la suit ; si elles divergent, c'est presque toujours le découpage de l'entrée qui a changé.

  1. Comportement par défaut. Observez ce que fait xargs sans commande.

    Fenêtre de terminal
    echo "un deux trois" | xargs

    Sans commande, xargs transmet les arguments à echo, la sortie est un deux trois.

  2. Supprimer des fichiers listés (test). Visualisez la suppression des fichiers listés dans fichiers.txt.

    Fenêtre de terminal
    cd ~/xargs-lab && cat fichiers.txt | xargs echo rm

    echo devant rm montre la commande qui serait exécutée, sans rien supprimer.

  3. Limiter les arguments. Affichez les nombres 1 à 6, deux par ligne.

    Fenêtre de terminal
    echo "1 2 3 4 5 6" | xargs -n 2 echo

    -n 2 limite chaque appel d'echo à 2 arguments.

  4. Positionner l'argument. Créez une copie .bak de chaque .txt du dossier documents.

    Fenêtre de terminal
    ls ~/xargs-lab/documents/*.txt | xargs -I {} cp {} {}.bak

    -I {} remplace {} par chaque argument, ce qui permet de l'employer deux fois.

  5. Confirmation interactive. Demandez une confirmation avant chaque suppression.

    Fenêtre de terminal
    echo "test1.tmp test2.tmp" | xargs -p rm

    -p affiche la commande et attend y/n avant de l'exécuter.

  6. Afficher les commandes exécutées. Tracez chaque commande avant son exécution.

    Fenêtre de terminal
    echo "1 2 3" | xargs -t -n 1 echo "Nombre:"

    -t écrit la commande sur stderr juste avant de la lancer.

  7. Gérer les espaces avec find -print0. Listez tous les .txt de documents, espaces compris.

    Fenêtre de terminal
    find ~/xargs-lab/documents -name "*.txt" -print0 | xargs -0 ls -l

    -print0 et -0 utilisent le caractère nul comme séparateur, mon rapport.txt reste un seul argument.

  8. Ne pas exécuter si vide. Évitez de lancer rm si aucun fichier .xyz n'existe.

    Fenêtre de terminal
    find ~/xargs-lab -name "*.xyz" | xargs -r rm

    -r empêche l'exécution lorsque l'entrée est vide.

  9. Exécution parallèle. Simulez le téléchargement de 3 URLs en parallèle.

    Fenêtre de terminal
    cat ~/xargs-lab/urls.txt | xargs -P 3 -I {} echo "Downloading {}"

    -P 3 lance jusqu'à 3 commandes simultanément.

  10. Combiner find et xargs pour grep. Cherchez Contenu dans tous les .txt.

    Fenêtre de terminal
    find ~/xargs-lab/documents -name "*.txt" -print0 | xargs -0 grep "Contenu"

    xargs passe toute la liste de fichiers à grep en une seule invocation.

  11. Pipeline complexe avec sh -c. Comptez les lignes de chaque fichier de log.

    Fenêtre de terminal
    ls ~/xargs-lab/logs/*.log | xargs -I {} sh -c 'echo -n "{} : "; wc -l < "{}"'

    sh -c permet d'utiliser un pipe ou plusieurs commandes pour chaque élément.

  12. Compresser des fichiers. Créez une archive tar.gz de tous les .txt.

    Fenêtre de terminal
    find ~/xargs-lab -name "*.txt" -print0 | xargs -0 tar -czvf ~/xargs-lab/archive.tar.gz

    xargs transmet tous les fichiers trouvés à tar en une fois.

Dix exercices pour valider votre maîtrise. Ils se traitent sur le lab ~/xargs-lab. Cherchez d'abord par vous-même, puis dépliez la solution pour vous corriger.

Ces quatre exercices portent sur le découpage et le placement des arguments, sans risque pour vos fichiers. Ils se traitent en une ligne chacun. Si vous butez, relancez la commande en ajoutant -t : la trace affichée montre exactement ce que xargs a construit avant d'exécuter.

Exercice 1, Transformation basique. Affichez fichier1 fichier2 fichier3 sur une seule ligne avec xargs. Indice : echo suivi de xargs sans argument.

Voir la solution
Fenêtre de terminal
echo "fichier1 fichier2 fichier3" | xargs

Sans commande, xargs utilise echo et concatène les arguments.

Exercice 2, Limiter les arguments. Affichez les nombres 1 à 6, deux par ligne. Indice : -n limite le nombre d'arguments.

Voir la solution
Fenêtre de terminal
echo "1 2 3 4 5 6" | xargs -n 2

-n 2 exécute echo avec 2 arguments à chaque passage.

Exercice 3, Positionner l'argument. Créez les fichiers backup_1.txt, backup_2.txt, backup_3.txt. Indice : -I {} positionne l'argument.

Voir la solution
Fenêtre de terminal
printf "1\n2\n3\n" | xargs -I {} touch backup_{}.txt

-I {} remplace {} par chaque ligne d'entrée, d'où le printf avec des retours à la ligne. La variante echo "1 2 3" | xargs -I {} touch backup_{}.txt échoue : -I découpant sur les sauts de ligne, elle crée un unique fichier nommé backup_1 2 3.txt. Ajouter -n 1 ne corrige rien, xargs avertit que -n et -I sont mutuellement exclusifs et ignore le -n.

Exercice 4, Mode verbeux. Affichez chaque commande echo avant son exécution. Indice : -t pour trace.

Voir la solution
Fenêtre de terminal
echo "a b c" | xargs -t -n 1 echo

-t affiche la commande sur stderr avant de l'exécuter.

On passe à l'enchaînement de plusieurs commandes et à la robustesse. Ces quatre exercices reproduisent les situations qui cassent en production : noms de fichiers avec espaces, entrée vide, recherche sur une liste calculée. La bonne réponse tient toujours compte de ce que produit la commande en amont, pas seulement de ce que doit faire la commande en aval.

Exercice 5, Gérer les espaces. Listez les fichiers .txt du lab, même ceux avec des espaces dans le nom. Indice : find -print0 + xargs -0.

Voir la solution
Fenêtre de terminal
find ~/xargs-lab -name "*.txt" -print0 | xargs -0 ls -l

-print0 et -0 utilisent le caractère nul comme séparateur.

Exercice 6, Éviter l'exécution vide. N'exécutez pas rm si aucun fichier .xyz n'existe. Indice : -r pour no-run-if-empty.

Voir la solution
Fenêtre de terminal
find ~/xargs-lab -name "*.xyz" | xargs -r rm

-r empêche l'exécution lorsque l'entrée standard est vide.

Exercice 7, Recherche dans les fichiers trouvés. Cherchez Contenu dans tous les .txt du lab. Indice : find + xargs + grep.

Voir la solution
Fenêtre de terminal
find ~/xargs-lab -name "*.txt" -print0 | xargs -0 grep "Contenu"

xargs passe tous les fichiers .txt trouvés à grep.

Exercice 8, Confirmation interactive. Demandez une confirmation avant de supprimer chaque fichier. Indice : -p pour prompt, -n 1 un fichier à la fois.

Voir la solution
Fenêtre de terminal
echo "file1 file2" | xargs -p -n 1 rm

-p demande confirmation ; -n 1 traite un fichier à la fois.

Les deux derniers exercices sortent du cadre « une commande, une liste ». Ils mobilisent le parallélisme et l'encapsulation par sh -c, seule façon d'utiliser un pipe ou une redirection à l'intérieur de chaque exécution. Chronométrez l'exercice 9 avec time : c'est la démonstration la plus parlante de ce que -P apporte.

Exercice 9, Exécution parallèle. Simulez 4 traitements en parallèle (un sleep puis un echo). Indice : -P pour le parallélisme.

Voir la solution
Fenêtre de terminal
printf "1\n2\n3\n4" | xargs -P 4 -I {} sh -c 'sleep 1; echo "Done {}"'

-P 4 lance jusqu'à 4 processus simultanément, les 4 se terminent quasi en même temps.

Exercice 10, Pipeline complexe. Pour chaque fichier .log du lab, comptez les lignes contenant Log. Indice : sh -c pour les pipes dans xargs.

Voir la solution
Fenêtre de terminal
find ~/xargs-lab -name "*.log" -print0 | xargs -0 -I {} sh -c 'echo -n "{} : "; grep -c "Log" "{}"'

sh -c autorise les pipes et redirections pour chaque élément traité.

Quand xargs se comporte mal, le problème vient presque toujours du découpage de l'entrée (espaces, lots, placeholder). Voici comment diagnostiquer.

Ces quatre commandes se lancent dans cet ordre. Les trois premières rendent visible ce que xargs fabrique réellement ; la quatrième donne la limite système à partir de laquelle le noyau refuse la ligne de commande. Sur une machine récente, getconf ARG_MAX retourne souvent plus de deux millions d'octets, mais xargs --show-limits donne la valeur qui compte vraiment : la taille du tampon effectivement utilisé, variables d'environnement déduites.

Fenêtre de terminal
# Voir ce qui serait exécuté, sans rien exécuter
find . -name "*.tmp" | xargs echo rm
# Afficher chaque commande avant exécution
echo "a b c" | xargs -t -n 1 echo
# Demander confirmation avant chaque exécution
cat liste.txt | xargs -p rm
# Connaître la taille maximale des arguments du système
getconf ARG_MAX
# Voir la limite réellement appliquée par xargs sur cette machine
xargs --show-limits < /dev/null

Trois messages reviennent en boucle. Le point commun : xargs les renvoie souvent avec le nom de la commande cible en préfixe, ce qui fait croire à un problème de rm ou de grep. Vérifiez toujours l'entrée avant d'incriminer la commande, en la rejouant avec xargs echo devant.

Message d'erreurCause probableSolution
Argument list too longTrop de fichiers passés en une foisLimiter les lots avec xargs -n
No such file or directoryEspaces ou caractères spéciaux dans les nomsUtiliser find -print0 | xargs -0
xargs: unmatched single quoteApostrophe dans un nom de fichierUtiliser -0 pour ignorer les caractères spéciaux

Cette liste étend le tableau des sept options essentielles avec trois entrées utiles au quotidien : -L découpe par lignes et non par mots, -a évite le cat inutile en lisant directement un fichier, -d change le séparateur quand l'entrée est un CSV ou une variable. Attention à -d et -0 : tous deux désactivent le traitement des guillemets et de l'antislash.

OptionRôleExemple
-n NAu plus N arguments par exécutionxargs -n 2
-I {}{} comme placeholderxargs -I {} mv {} {}.bak
-0Séparateur nul (avec find -print0)find . -print0 | xargs -0
-pConfirmation avant exécutionxargs -p rm
-tAffiche la commande (trace)xargs -t echo
-rNe rien exécuter si l'entrée est videxargs -r rm
-P NN processus en parallèlexargs -P 4
-L NAu plus N lignes par exécutionxargs -L 1
-a fichierLire depuis un fichier au lieu de stdinxargs -a liste.txt rm
-d delimDéfinir le séparateurxargs -d ","

Quatre motifs à mémoriser tels quels. Le deuxième, find -print0 | xargs -0, est celui à écrire par défaut dès qu'il s'agit de fichiers : il coûte six caractères de plus et supprime toute une classe d'incidents. Le troisième, sh -c, est le seul moyen d'utiliser un pipe ou une redirection à l'intérieur de chaque exécution.

EnchaînementRôleExemple
cmd | xargsTransformer stdin en argumentsecho "a b" | xargs echo
find -print0 | xargs -0Pattern sûr pour les fichiersfind . -name "*.txt" -print0 | xargs -0 rm
xargs -I {} sh -c '…'Commande complexe avec pipesxargs -I {} sh -c 'cat {} | wc -l'
cmd | xargs echoTester sans exécutercat liste | xargs echo rm

Vous maîtrisez xargs lorsque vous pouvez cocher chacun de ces points :

  • Je sais transformer une entrée standard en arguments
  • Je sais limiter le nombre d'arguments avec -n
  • Je sais positionner l'argument avec -I {}
  • Je sais déboguer avec -t et -p
  • Je sais gérer les noms avec espaces grâce à -0
  • Je sais éviter l'exécution sur entrée vide avec -r
  • Je sais combiner find, xargs et grep
  • Je sais exécuter en parallèle avec -P
  • Je sais encapsuler un pipe avec sh -c

La commande xargs est le chaînon manquant entre les commandes qui produisent des listes (find, grep -l, cat) et celles qui attendent des arguments (rm, mv, cp). Ses options clés sont -0 (sécurité avec les espaces), -I {} (positionnement), -n (limitation) et -P (parallélisme). Pour des besoins plus avancés (machines distantes, jobs complexes), explorez parallel.

Les questions ci-dessous reprennent les points qui reviennent le plus souvent sur xargs : la syntaxe de base, le traitement des noms de fichiers contenant des espaces, le comportement sur entrée vide, la limite d'arguments et le parallélisme.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn