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 {} +