Aller au contenu
Administration Linux medium

Maîtriser xargs : Arguments depuis stdin

9 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)find | xargs cmd❌ Fork par fichier
Fichiers avec espaces⚠️ Nécessite -print0 | xargs -0✅ Géré automatiquement
Exécution parallèle-P N
Syntaxe simple
Sans pipe-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.

Fenêtre de terminal
commande_source | xargs [OPTIONS] commande_cible
É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
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
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 ✓

Note : -I implique -n 1 (un argument par exécution).

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

Fenêtre de terminal
# ❌ DANGER : "mon fichier.txt" devient 2 arguments
find . -name "*.txt" | xargs rm
# rm essaie de supprimer "mon" et "fichier.txt" séparément !
# ✅ 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 !

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
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
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 des modèles courants pour des traitements fréquents.

Ces recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.

Transformation basique Base

Passer une liste comme arguments à une commande.

echo "file1.txt file2.txt" | xargs rm
Formule echo "a b c" | xargs <commande>
Exemple
echo "file1.txt file2.txt" | xargs rm
Paramètres
  • commande — Commande qui reçoit les arguments
Lire depuis un fichier Base

Traiter une liste de fichiers depuis un fichier texte.

cat fichiers.txt | xargs rm
Formule cat <liste> | xargs <commande>
Exemple
cat fichiers.txt | xargs rm
Paramètres
  • liste — Fichier contenant la liste
Limiter les arguments Base

Exécuter la commande avec N arguments maximum.

echo "1 2 3 4 5 6" | xargs -n 2 echo
Formule xargs -n N <commande>
Exemple
echo "1 2 3 4 5 6" | xargs -n 2 echo
Paramètres
  • -n N — Maximum N arguments par exécution
Positionner l'argument Inter.

Utiliser l'argument à un emplacement spécifique.

ls *.txt | xargs -I {} mv {} {}.bak
Formule xargs -I {} <commande avec {}>
Exemple
ls *.txt | xargs -I {} mv {} {}.bak
Paramètres
  • -I {} — Remplace {} par l'argument
Séparateur null (espaces dans noms) Inter.

Gérer les noms de fichiers avec espaces.

find . -name "*.txt" -print0 | xargs -0 rm
Formule find . -print0 | xargs -0 <commande>
Exemple
find . -name "*.txt" -print0 | xargs -0 rm
Paramètres
  • -print0 — find produit des nuls
  • -0 — xargs lit des nuls
Confirmation interactive Base

Demander confirmation avant chaque exécution.

echo "file1 file2" | xargs -p rm
Formule xargs -p <commande>
Exemple
echo "file1 file2" | xargs -p rm
Paramètres
  • -p — Prompt avant exécution
Mode verbeux Base

Afficher la commande avant exécution.

echo "1 2 3" | xargs -t -n 1 echo
Formule xargs -t <commande>
Exemple
echo "1 2 3" | xargs -t -n 1 echo
Paramètres
  • -t — Trace (affiche la commande)
Éviter exécution sur vide Base

Ne pas exécuter si stdin est vide.

find . -name "*.xyz" | xargs -r rm
Formule xargs -r <commande>
Exemple
find . -name "*.xyz" | xargs -r rm
Paramètres
  • -r — No run if empty
Exécution parallèle Avancé

Exécuter plusieurs commandes en parallèle.

cat urls.txt | xargs -P 4 -I {} curl -O {}
Formule xargs -P N <commande>
Exemple
cat urls.txt | xargs -P 4 -I {} curl -O {}
Paramètres
  • -P N — N processus en parallèle
find + xargs + rm Inter.

Supprimer des fichiers trouvés par find.

find /tmp -name "*.tmp" -print0 | xargs -0 rm
Formule find <chemin> -name "<pattern>" -print0 | xargs -0 rm
Exemple
find /tmp -name "*.tmp" -print0 | xargs -0 rm
Paramètres
  • chemin — Répertoire de recherche
  • pattern — Motif de fichiers
find + xargs + grep Inter.

Rechercher du texte dans les fichiers trouvés.

find . -name "*.py" -print0 | xargs -0 grep "import"
Formule find . -name "<pattern>" -print0 | xargs -0 grep "<motif>"
Exemple
find . -name "*.py" -print0 | xargs -0 grep "import"
Paramètres
  • pattern — Type de fichiers
  • motif — Texte à rechercher
Renommer en masse Inter.

Renommer plusieurs fichiers avec un pattern.

ls *.bak | xargs -I {} mv {} {}.old
Formule ls <pattern> | xargs -I {} mv {} <nouveau_pattern>
Exemple
ls *.bak | xargs -I {} mv {} {}.old
Paramètres
  • pattern — Fichiers à renommer
  • nouveau_pattern — Nouveau nom/extension
Créer une archive Inter.

Archiver des fichiers trouvés.

find . -name "*.log" -print0 | xargs -0 tar -czvf logs.tar.gz
Formule find . -name "<pattern>" -print0 | xargs -0 tar -czvf <archive>
Exemple
find . -name "*.log" -print0 | xargs -0 tar -czvf logs.tar.gz
Paramètres
  • pattern — Fichiers à archiver
  • archive — Nom de l'archive
Changer les permissions en masse Inter.

Appliquer chmod sur plusieurs fichiers.

find . -type f -name "*.sh" -print0 | xargs -0 chmod +x
Formule find . -type f -name "<pattern>" -print0 | xargs -0 chmod <mode>
Exemple
find . -type f -name "*.sh" -print0 | xargs -0 chmod +x
Paramètres
  • pattern — Fichiers à modifier
  • mode — Nouvelles permissions

Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.

Noms de fichiers avec espaces

find . -name "*.txt" | xargs rm (échoue si "mon fichier.txt")

Danger
Le piège : find . -name "*.txt" | xargs rm (échoue si "mon fichier.txt")
Symptôme : Erreur "No such file" ou fichiers partiellement supprimés
Cause : xargs découpe par espaces, donc "mon fichier.txt" devient 2 arguments
Correction : Utiliser find -print0 | xargs -0
find . -name "*.txt" -print0 | xargs -0 rm
Exécuter sans tester

cat liste.txt | xargs rm (suppression immédiate)

Danger
Le piège : cat liste.txt | xargs rm (suppression immédiate)
Symptôme : Fichiers supprimés par erreur, irréversible
Cause : Pas de vérification avant exécution
Correction : Tester avec echo ou -p d'abord
cat liste.txt | xargs echo rm  # puis xargs -p rm
Exécution sur entrée vide

find . -name "*.xyz" | xargs rm (exécute "rm" sans argument)

Attention
Le piège : find . -name "*.xyz" | xargs rm (exécute "rm" sans argument)
Symptôme : Message d'erreur ou comportement inattendu
Cause : xargs exécute la commande même sans argument
Correction : Ajouter -r (--no-run-if-empty)
find . -name "*.xyz" | xargs -r rm
Dépassement de la limite d'arguments

find / -type f | xargs ls (trop de fichiers)

Attention
Le piège : find / -type f | xargs ls (trop de fichiers)
Symptôme : Erreur "Argument list too long"
Cause : Le système a une limite sur la taille des arguments
Correction : xargs gère automatiquement en découpant, mais vérifier avec -n
find / -type f -print0 | xargs -0 -n 1000 ls
Oubli de -I avec placeholder

ls *.txt | xargs mv {} backup/ (erreur de syntaxe)

Attention
Le piège : ls *.txt | xargs mv {} backup/ (erreur de syntaxe)
Symptôme : {} est interprété littéralement
Cause : -I doit être spécifié pour activer le placeholder
Correction : Ajouter -I {} avant la commande
ls *.txt | xargs -I {} mv {} backup/
Commande introuvable avec -I

ls | xargs -I {} echo {} | wc -l (pipe après -I)

Attention
Le piège : ls | xargs -I {} echo {} | wc -l (pipe après -I)
Symptôme : Le pipe fait partie de la commande xargs
Cause : -I prend tout ce qui suit comme commande
Correction : Utiliser sh -c pour les pipes complexes
ls | xargs -I {} sh -c 'echo {} | wc -c'
Sortie mélangée en parallèle

xargs -P 4 commande (sorties entremêlées)

Info
Le piège : xargs -P 4 commande (sorties entremêlées)
Symptôme : Les lignes de sortie des différents processus sont mélangées
Cause : Exécution parallèle sans synchronisation de sortie
Correction : Rediriger chaque sortie vers un fichier séparé
xargs -P 4 -I {} sh -c 'commande {} > {}.out'
Expansion des guillemets

echo "a b" "c d" | xargs -n 1 (4 arguments au lieu de 2)

Info
Le piège : echo "a b" "c d" | xargs -n 1 (4 arguments au lieu de 2)
Symptôme : xargs ne respecte pas les guillemets de l'entrée
Cause : xargs ignore les guillemets par défaut
Correction : Utiliser un séparateur explicite ou -d
printf "a b\0c d" | xargs -0 -n 1

📋 Cheatsheet xargs

📝 Syntaxe :

cmd | xargs Transformer stdin en arguments

🚀 Commandes types :

Transformation basique Passer une liste comme arguments à une commande.
echo "file1.txt file2.txt" | xargs rm
Lire depuis un fichier Traiter une liste de fichiers depuis un fichier texte.
cat fichiers.txt | xargs rm
Limiter les arguments Exécuter la commande avec N arguments maximum.
echo "1 2 3 4 5 6" | xargs -n 2 echo
Confirmation interactive Demander confirmation avant chaque exécution.
echo "file1 file2" | xargs -p rm
Mode verbeux Afficher la commande avant exécution.
echo "1 2 3" | xargs -t -n 1 echo

⚙️ Options

xargs -n N Maximum N arguments par exécution xargs -n 2
xargs -I {} Utiliser {} comme placeholder xargs -I {} mv {} {}.bak
xargs -0 Séparateur null (avec find -print0) find . -print0 | xargs -0
xargs -p Confirmation avant exécution xargs -p rm
xargs -t Afficher la commande (trace) xargs -t echo
xargs -r Ne pas exécuter si vide xargs -r rm
xargs -P N N processus en parallèle xargs -P 4
xargs -L N Maximum N lignes par exécution xargs -L 1
xargs -a fichier Lire depuis fichier xargs -a liste.txt rm
xargs -d delim Utiliser delim comme séparateur xargs -d ","

🔗 Composition

find -print0 | xargs -0 Pattern sécurisé pour fichiers find . -name "*.txt" -print0 | xargs -0 rm
xargs -I {} sh -c '...' Commande complexe avec pipes xargs -I {} sh -c 'cat {} | wc -l'
xargs echo Tester sans exécuter cat liste | xargs echo rm

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% 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

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.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.