xargs

Utilisation de xargs dans un shell UNIX

Syntaxe

xarg est une commande UNIX puissante qui permet de récupérer les arguments en sortie de la commande précédente et de les traiter à travers un pipe.

Il permet d'éviter des structures lourdes comme :

[commande] | while read param
do
[traitement]
done

À la place, nous avons quelque chose de plus simple, de plus condensé :

[commande] | xargs [traitement]

Exemples

cp

Copier la liste des fichiers .txt dans un répertoire :

ls -1 ${repertoire_source}/*.txt | xargs -i -t cp {} ${repertoire_cible}

Copier la liste des fichiers .txt dans un répertoire cible depuis un répertoire relatif :

ls -1 ${repertoire_source}/*.txt | xargs -i -t cp {} ${repertoire_cible}

Copier un fichier dans plusieurs répertoires :

echo ${répertoire_1} ${répertoire_2} | xargs -n 1 cp -v ${fichier_à_copier}

mv

Renommer tous les fichiers *.txt d'un répertoire :

ls -1 ${repertoire}/*.txt | xargs -I {} -t mv {}.csv

Déplacer (sans renommer) tous les fichiers *.txt vers un autre répertoire :

ls -1 ${repertoire}/*.txt | xargs -I {} -t mv {} ${repertoire_cible}

rm

Supprimer tous les fichiers *.txt d'un répertoire :

ls -1 ${repertoire}/*.txt | xargs rm -f

Dans certains cas, lorsque le nombre de fichiers à supprimer est trop important, le commande rm retourne une erreur :

/bin/rm: Argument list too long.

Dans ce cas, xargs permet de résoudre le problème en passant, par exemple, par find :

find . -type f -name "motif" -print | xargs rm -f

basename

La commande basename n'apprécie pas trop les tubes (pipes). Pour remédier à ce problème, après un ls, par exemple, il faut :

ls -1 ${repertoire}/*.txt | xargs -n1 basename

kill

Tuer tous les processus contenant un motif donné :

ps -ax | grep "${motif}" | grep -v "grep" | awk '{print $1}'| xargs kill -9

ls

Lister les informations des fichiers et répertoire contenant un motif donné :

find . -type f -name "*.txt" -print | xargs ls -l -D %Y-%m-%d

Voir une application : générer un sitemap automatiquement

find + grep

Rechercher un motif dans un fichier.

Par exemple, ici, le motif n.nspname dans tous les fichiers .sql :

find . -type f -name '*.sql' | xargs grep 'n.nspname'

find + chmod

Pour changer récursivement les droits de fichiers ou répertoires.

Pour changer les droits sur les répertoires uniquement :

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755

Pour changer les droits sur les fichiers uniquement :

find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

Il est aussi possible d'utiliser find pour l'opération, de la façon suivante :

find /path/to/base/dir -type d -exec chmod 755 {} +
find /path/to/base/dir -type f -exec chmod 644 {} +