xargs

Demandez et postez vos petites astuces, répertoire des tutoriels et astuces
Verrouillé
Avatar du membre
cyrille
Messages : 2931
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nord - Avesnois
Contact :

xargs

Message par cyrille » lun. 17 juin 2019 18:35

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 : Tout sélectionner

echo 'one two three' | xargs mkdir
ls
one two three
Vous me direz que ça va plus vite en tapant simplement

Code : Tout sélectionner

mdkir one two three
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 : Tout sélectionner

find /tmp -mtime +14 | xargs rm
Avancer toutes les dates du répertoire "date" de 2 jours

Code : Tout sélectionner

find date/  -print0 | xargs -0 -I '{}' touch -r '{}' -d '+2 day' '{}'
Ouvrir tous les fichiers trouvés avec gedit

Code : Tout sélectionner

find . -name "foo*" -print0 | xargs -0 gedit
Trouver tous les fichiers contenant l'occurence abc

Code : Tout sélectionner

find -name "*.txt" | xargs grep "abc"
Trouver tous les fichiers png d'une archive tar.gz

Code : Tout sélectionner

find Images/Dossier/ -name "*.png" -type f -print0 | xargs -0 tar -cvzf Arcgive.tar.gz
Connaitre le nombre de lignes, mots, caractères des fichiers d'une liste

Code : Tout sélectionner

ls *.txt | xargs wc
Effacer des fichiers du répertoire courant (ici les fichiers avec extension .c)

Code : Tout sélectionner

find . -name "*.c" | xargs rm -rf
Le même si les fichiers contiennent des espaces

Code : Tout sélectionner

find . -name "*.c" -print0 | xargs -0 rm -rf
Le même sur un dossier spécifique

Code : Tout sélectionner

find /home/MonUser/MonDossier/ -name "*.c" -print0 | xargs -0  rm -rf
Générer une liste compacte des users d'un système

Code : Tout sélectionner

cut -d: -f1 < /etc/passwd | sort | xargs echo

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 : Tout sélectionner

cat test.txt
tata
toto
tutu

Code : Tout sélectionner

cat test.txt | xargs -I % sh -c 'echo %; mkdir %'
tata
toto
tutu

Code : Tout sélectionner

ls 
tata toto tutu

5. L'option -t de xargs
Cette options (-t) permet l'affichage des commandes qui sont effectuées.

Code : Tout sélectionner

echo 'one two three' | xargs -t rm
rm one two three


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 : Tout sélectionner

time find . -name "*.jpg" -exec ls {} ;
real    0m6.618s
user    0m1.465s
sys     0m4.396s

Code : Tout sélectionner

time find . -name "*.jpg" -print0 | xargs -0 ls
real    0m1.120s
user    0m0.594s
sys     0m0.527s
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 : Tout sélectionner

man xargs
man find
man exec
# Me : DELL Lat E5430, SSD, 64-bit, RAM 8Go [ FreeBSD 12.0, xfce / Openbox ; DEBIAN SID via VirtualBox] | E7440, SSD, amd64, RAM 8Go [ DEBIAN SID, xfce]
# Me : VPS : 1 vCore 2 GHz , SSD, RAM 2Go, Local RAID, DEBIAN STABLE https://cbiot.fr
# Work : Serveur HP ProLiant ML 310e Gen 8 v2, DEBIAN STABLE | Parc DELL Lat E6* LINUX MINT, 18.3 Sylvia, amd64, XFCE.

All you need : #!/bin/bash | SVP les chiants pas de MP...

gacaron
Messages : 284
Enregistré le : mer. 26 oct. 2016 18:01

Re: xargs

Message par gacaron » mar. 18 juin 2019 11:20

Bonjour,
Vraiment très intéressant !!! :-o :-o
Merci beaucoup ! :B
Machine: HP Pavilion g7-2310 - CPU : i5-3230M / RAM : 8 Go
Kernel: 4.15.0-43-generic x86_64 bits: 64
Desktop: Cinnamon 4.0.9 Linux Mint 19.1 Tessa
Graphics: Card-1: Intel 3rd Gen Core / Card-2: [AMD/ATI] [Radeon HD 7500M/7600M Series]
Wifi : Ralink RT5390R 802.11bgn / Ethernet : Realtek RTL8101/2/6E PCI Express Fast/Gigabit Ethernet

Avatar du membre
cyrille
Messages : 2931
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nord - Avesnois
Contact :

Re: xargs

Message par cyrille » mar. 18 juin 2019 11:31

merci
ça fait plaisir de voir que des gens s'intéressent au shell ;)
# Me : DELL Lat E5430, SSD, 64-bit, RAM 8Go [ FreeBSD 12.0, xfce / Openbox ; DEBIAN SID via VirtualBox] | E7440, SSD, amd64, RAM 8Go [ DEBIAN SID, xfce]
# Me : VPS : 1 vCore 2 GHz , SSD, RAM 2Go, Local RAID, DEBIAN STABLE https://cbiot.fr
# Work : Serveur HP ProLiant ML 310e Gen 8 v2, DEBIAN STABLE | Parc DELL Lat E6* LINUX MINT, 18.3 Sylvia, amd64, XFCE.

All you need : #!/bin/bash | SVP les chiants pas de MP...

Avatar du membre
david37
modérateur
Messages : 3103
Enregistré le : lun. 22 août 2016 05:06

Re: xargs

Message par david37 » mer. 19 juin 2019 01:22

Ayant découvert récemment la combinaison find | xargs ... je suis fan :D merci pour le tuto Cyrille ;)
PC1: Hp pavilion g6 / 1.36 GHz AMD E2-1800 APU with Radeon(tm) HD Graphics / 500 GB hard drive / 4G RAM /
Debian 9.9 Xfce
PC2: Hp-Pavilion Slimline / 2.5 GHz AMD RV710 / 4GB RAM / 500 GB hard drive / LM 18.3 Xfce x64
PC3: Lenovo ThinkPad R61i / 1.87 GHz Intel T2390 / NVIDIA G86M / 2GB RAM / 100 GB Hard Drive / LMDE2-Mate x64
PC4: Dell-Latitude E7240 / 2GHz i5-4310U / Intel Haswell-ULT HD 4400 / 8GB RAM / 500 GB Hard Drive / LM 19.1 Xfce x64

Avatar du membre
cyrille
Messages : 2931
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nord - Avesnois
Contact :

Re: xargs

Message par cyrille » mer. 19 juin 2019 07:28

oui je me suis dit que ça pouvait être intéressant un point sur cette commande
merci de l'idée soufflée dans l'oreille ...
# Me : DELL Lat E5430, SSD, 64-bit, RAM 8Go [ FreeBSD 12.0, xfce / Openbox ; DEBIAN SID via VirtualBox] | E7440, SSD, amd64, RAM 8Go [ DEBIAN SID, xfce]
# Me : VPS : 1 vCore 2 GHz , SSD, RAM 2Go, Local RAID, DEBIAN STABLE https://cbiot.fr
# Work : Serveur HP ProLiant ML 310e Gen 8 v2, DEBIAN STABLE | Parc DELL Lat E6* LINUX MINT, 18.3 Sylvia, amd64, XFCE.

All you need : #!/bin/bash | SVP les chiants pas de MP...

Verrouillé