Outils pour utilisateurs

Outils du site


xargs
no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


Révision précédente
Prochaine révision
xargs [2019/07/17 19:24] – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== Utiliser xargs [How To Section Shell, ligne de commande] ======
  
 +
 +===== 1. xargs =====
 +
 +La commande **xargs** sous UNIX est un utilitaire de ligne de commande permettant de créer un pipeline d'exécution à partir d'une entrée standard.
 +Bien que des outils tels que grep puissent accepter l’entrée standard en tant que paramètre, de nombreux autres outils ne le peuvent pas.
 +L'utilisation de **xargs** permet à des outils tels que **echo**, **rm** et **mkdir** d'accepter les entrées standard en tant qu'arguments.
 +
 +
 +===== 2. Utilisation de base =====
 +
 +
 +Exemple : création de 3 répertoires avec xargs
 +
 +<code bash>echo 'one two three' | xargs mkdir
 +ls
 +one two three</code>
 +
 +Vous me direz que ça va plus vite en tapant simplement
 +
 +<code bash>mdkir one two three</code>
 +
 +Pas faux, sur ce coup.... Mais vous vous doutez bien qu'on va un peu pousser les choses...
 +
 +
 +===== 3. Associer xargs et find : des exemples concrets =====
 +
 +
 +==== 3.1 En gros ====
 +
 +On lance **find** (sur le répertoire courant (.) ou dans un répertoire spécifique (/Nom/Du/Dir) avec une option de recherche (**-name** ,basée sur le nom ;** -time**, basé sur la date, etc...) et tout ce qu'il trouve, on lui applique ce qui est lancé après le pipeline c'est à dire après xargs.
 +Tout simple donc.
 +A savoir si on joue avec des fichiers ou des répertoires avec des espaces, on passera l'option **-print0 à find** et **-0 à xargs**.
 +
 +Bon maintenant que vous savez, je pense qu'il vaut mieux mettre quelques exemples concrets
 +
 +==== 3.2 Exemples concrets ====
 +
 +
 +Trouver les fichiers temporaires vieux de plus de 14 jours et les supprimer
 +
 +<code bash>find /tmp -mtime +14 | xargs rm</code>
 +
 +Avancer toutes les dates du répertoire "date" de 2 jours
 +
 +<code bash>find date/  -print0 | xargs -0 -I '{}' touch -r '{}' -d '+2 day' '{}'</code>
 +
 +Ouvrir tous les fichiers trouvés avec gedit
 +
 +
 +<code bash>find . -name "foo*" -print0 | xargs -0 gedit</code>
 +
 +Trouver tous les fichiers contenant l'occurence abc
 +
 +<code bash>find -name "*.txt" | xargs grep "abc"</code>
 +
 +Trouver tous les fichiers png d'une archive tar.gz
 +
 +<code bash>find Images/Dossier/ -name "*.png" -type f -print0 | xargs -0 tar -cvzf Arcgive.tar.gz</code>
 +
 +Connaitre le nombre de lignes, mots, caractères des fichiers d'une liste
 +
 +<code bash>ls *.txt | xargs wc</code>
 +
 +Effacer des fichiers du répertoire courant (ici les fichiers avec extension .c)
 +
 +<code bash>find . -name "*.c" | xargs rm -rf</code>
 +
 +Le même si les fichiers contiennent des espaces
 +
 +<code bash>find . -name "*.c" -print0 | xargs -0 rm -rf</code>
 +
 +Le même sur un dossier spécifique
 +
 +<code bash>find /home/MonUser/MonDossier/ -name "*.c" -print0 | xargs -0  rm -rf</code>
 +
 +Générer une liste compacte des users d'un système
 +
 +<code bash>cut -d: -f1 < /etc/passwd | sort | xargs echo</code>
 +
 +
 +===== 4. L'option -I de xargs =====
 +
 +Il est possible d'exécuter plusieurs commandes avec **xargs** en utilisant l'indicateur **-I**.
 +Ceci remplace les occurrences de l'argument par l'argument transmis à **xargs**.
 +Les impressions suivantes font écho à une chaîne et créent un dossier.
 +
 +
 +<code bash>cat test.txt
 +tata
 +toto
 +tutu</code>
 +
 +<code bash>cat test.txt | xargs -I % sh -c 'echo %; mkdir %'
 +tata
 +toto
 +tutu</code>
 +<code bash>
 +ls 
 +tata toto tutu</code>
 +
 +
 +===== 5. L'option -t de xargs =====
 +
 +Cette options (**-t**) permet l'affichage des commandes qui sont effectuées.
 +
 +<code bash>echo 'one two three' | xargs -t rm
 +rm one two three</code>
 +
 +
 +
 +===== 6. exec VS xargs =====
 +
 +On retrouve les mêmes fonctionnalités "**find -exec" que "find | xargs**" avec des subtilités bien sûr.
 +Mais les tests effectués sur de grosses quantités de fichiers montrent que l'association "**find | xargs**" est beaucoup plus rapide.
 +
 +Exemple sur plus de 1 500 images
 +
 +<code bash>time find . -name "*.jpg" -exec ls {} ;
 +real    0m6.618s
 +user    0m1.465s
 +sys     0m4.396s</code>
 +
 +<code bash>time find . -name "*.jpg" -print0 | xargs -0 ls
 +real    0m1.120s
 +user    0m0.594s
 +sys     0m0.527s</code>
 +
 +Donc on va dire que pour une utilisation simple, xargs va plus vite ;) (attention dans certains cas, il vaut mieux utiliser exec)
 +
 +
 +===== 7. Conclusions =====
 +
 +Bon voilà une commande très puissante
 +Plus de détail
 +<code bash>
 +man xargs
 +man find
 +man exec</code>
xargs.txt · Dernière modification : 2020/03/22 15:36 de crust