← Sommaire SkyLinux

Leçon 67 : xargs — Construire des commandes à partir de résultats

La commande xargs est un outil puissant qui permet de construire et d'exécuter des commandes à partir de résultats lus sur l'entrée standard. Elle est particulièrement utile pour chaîner des commandes avec des Pipes et traiter de grandes quantités de données.

1. Comment fonctionne xargs ?

xargs lit des données depuis l'entrée standard (stdin), puis les utilise comme arguments pour exécuter une commande. Sans argument, il exécute echo par défaut.

# Syntaxe de base
commande | xargs commande_target

2. Exemples pratiques

2.1 Supprimer plusieurs fichiers

Trouver et supprimer des fichiers spécifiques avec find :

find ~/documents -name "*.tmp" | xargs rm

Ici, xargs prend chaque résultat de find et le passe comme argument à rm.

2.2 Utiliser un délimiteur personnalisé

Par défaut, xargs utilise les espaces et sauts de ligne comme délimiteurs. Vous pouvez spécifier un autre délimiteur avec -d :

echo "f1.txt,f2.txt,f3.txt" | xargs -d ',' rm

2.3 Spécifier le nombre d'arguments par ligne

Par défaut, xargs passe autant d'arguments que possible sur une seule ligne. Utilisez -n pour limiter :

# Exécuter rm avec 1 fichier à la fois
find ~/documents -name "*.tmp" | xargs -n 1 rm

3. Utilisation avec des espaces et caractères spéciaux

3.1 Le problème des espaces dans les noms de fichiers

Si un nom de fichier contient des espaces, xargs peut mal l'interpréter. La solution est d'utiliser find -print0 et xargs -0 :

# Traitement sécurisé des noms de fichiers avec espaces
find ~/documents -name "*.txt" -print0 | xargs -0 rm

3.2 Utiliser un substitut de position

Par défaut, les arguments sont ajoutés à la fin de la commande. Utilisez -I pour spécifier où insérer les arguments :

# Copier chaque fichier vers un répertoire
find ~/documents -name "*.pdf" | xargs -I {} cp {} ~/backup/

Le symbole {} est remplacé par chaque argument lu.

4. Exécuter plusieurs commandes

4.1 Avec -I pour enchaîner des actions

# Créer une archive pour chaque fichier trouvé
ls *.log | xargs -I {} tar -czf {}.tar.gz {}

4.2 Combiner avec un script Bash

# Exécuter un script personnalisé sur chaque fichier
find ~/documents -type f | xargs -I {} bash -c 'echo "Traitement de: {}"'

5. Utilisation avancée

5.1 Demander confirmation avant exécution

Utilisez -p pour afficher la commande et demander confirmation :

find ~/documents -name "*.tmp" | xargs -p rm

5.2 Afficher les commandes sans les exécuter

Utilisez -t pour afficher les commandes exécutées (mode verbose) :

find ~/documents -name "*.tmp" | xargs -t rm

5.3 Limiter le nombre de lignes de commande

Utilisez -s pour limiter la longueur totale de la ligne de commande :

# Limiter à 500 caractères par ligne
find ~/documents -name "*.txt" | xargs -s 500 ls -l

6. Cas d'utilisation courants

6.1 Rechercher et modifier des permissions

# Changer les permissions de plusieurs fichiers
find ~/documents -name "*.sh" | xargs chmod 755

6.2 Rechercher et compter les lignes

# Compter les lignes de plusieurs fichiers
find ~/documents -name "*.py" | xargs wc -l

6.3 Envoyer des emails pour chaque résultat

# Envoyer un email pour chaque résultat de grep
grep -r "error" /var/log | xargs -I {} mail -s "Alerte" admin@example.com

7. Résumé des options courantes

OptionDescription
-n NLimiter à N arguments par commande
-d CARUtiliser CAR comme délimiteur
-0Traiter les NUL comme délimiteurs (avec find -print0)
-I {}Remplacer {} par les arguments
-pDemander confirmation avant exécution
-tAfficher la commande avant exécution
-s NLimiter la longueur de ligne à N caractères

8. Exercices pratiques

  1. Trouvez tous les fichiers .log de votre répertoire personnel et affichez leur taille avec ls -lh en utilisant xargs.
  2. Créez une commande qui utilise find et xargs pour compter le nombre de lignes dans tous les fichiers .txt d'un répertoire.
  3. Utilisez xargs -I pour copier chaque fichier d'un répertoire vers un autre.
  4. Expérimentez avec xargs -p pour voir comment fonctionne la confirmation interactive.

Conclusion

xargs est un outil essentiel pour tout administrateur Linux. Il permet de chaîner des commandes de manière flexible et puissante, transformant les résultats d'une commande en arguments pour une autre. Combiné avec find et les Pipes, il devient un outil de manipulation de fichiers très puissant.