Commandes Linux : xargs

XARGS

Installé avec le paquet findutils
Voir aussi : find, grep, setfacl et touch

 

Afficher la version de la commande xargs

xargs --version

ou

apt-cache policy findutils

 

Exécuter une commande en sortie d’une précédente

commande | xargs commande

 

Demander confirmation avant l’exécution d’une commande en sortie d’une précédente

commande | xargs -p commande

 

Eviter les problèmes liés aux fichiers avec espaces

Par défaut, chaque résultat est séparé du suivant avec un saut de ligne « \n » grâce à l’option « -print » implicite. Or, si le résultat est redirigé vers une commande, cette dernière agira sur chaque élément retourné séparé du suivant par un espace :

find path -print | xargs action

Donc si un fichier comporte des espaces dans son nom, le résultat ne sera pas celui attendu.
Par exemple, avec le fichier suivant :

# ls -lAi
total 0
796250 -rw-r--r-- 1 root root 0 déc.  11 00:53 fichier test avec des espaces.txt
# find . -print | xargs ls -dils
ls: impossible d'accéder à ./fichier: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à test: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à avec: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à des: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à espaces.txt: Aucun fichier ou dossier de ce type

On pourrait très bien signifier à xargs de considérer les éléments séparés par des saut de ligne « \n » :
# find path | xargs -d "\n" ls -dils
Toutefois, la manière optimale pour éviter ce problème consiste à séparer les résultats retournés par find avec un caractère nul et signifier à la commande de sortie xargs qu’elle distingue ces résultats grâce à celui-ci.
Le paramètre -print0 ajoute un caractère nul « \0 » à la fin de chaque élément trouvé. La commande xargs -0 sépare chaque élément à traiter grâce à ce caractère.

find path -print0 | xargs -0 action

Equivaut à :
find path -print0 | xargs -d "\0" action

# find . -print0 | xargs -0 ls -dils
796256 4 drwxr-xr-x 2 root root 4096 déc.  11 00:54 .
796250 0 -rw-r--r-- 1 root root    0 déc.  11 00:53 ./fichier test avec des espaces.txt

 

Exécuter une commande en sortie de la commande find

find path -print0 | xargs -0 commande

Equivaut à :
find path -exec commande
find path -ok commande
Le paramètre -ok demande une confirmation avant l’exécution de la commande, contrairement à -exec, donc si la commande consiste en une suppression de fichiers, une demande de confirmation aura lieu pour chaque fichier trouvé.
ex :

# find . -print0 | xargs -0 ls -dils

 

Renouveler récursivement les atime mtime et ctime de tout le contenu d’un dossier :

find dossier -print0 | xargs -0 touch

Equivaut à :
find dossier -exec touch {} \;
find dossier -exec touch {} +
ex :

find . -print0 | xargs -0 touch

 

Ajouter des ACL étendues récursivement uniquement sur les fichiers

A partir de la ligne de commande
find . -type f -print0 | xargs -0 setfacl -m u:user:(rwx),g:group:(rwx)

Equivaut à :
find . -type f -exec setfacl -m u:user:(rwx),g:group:(rwx) {} +
find . -type f -exec setfacl -m u:user:(rwx),g:group:(rwx) {} \;

A partir d’un fichier de référence
find . -type f -print0 | xargs -0 setfacl -M aclfilename

Equivaut à :
find . -type f -exec setfacl -M aclfilename {} +
find . -type f -exec setfacl -M aclfilename {} \;

 

Ajouter des ACL étendues récursivement uniquement sur les dossiers

A partir de la ligne de commande
find . -type d -print0 | xargs -0 setfacl -m u:user:(rwx),g:group:(rwx)

Equivaut :
find . -type d -exec setfacl -m u:user:(rwx),g:group:(rwx) {} +
find . -type d -exec setfacl -m u:user:(rwx),g:group:(rwx) {} \;

A partir d’un fichier de référence
find . -type d -print0 | xargs -0 setfacl -M aclfilename

Equivaut à :
find . -type d -exec setfacl -M aclfilename {} +
find . -type d -exec setfacl -M aclfilename {} \;

 

Supprimer toutes les ACL étendues récursivement sur le contenu d’un dossier

Uniquement sur les fichiers contenus dans ce dossier
find . -type f -print0 | xargs -0 setfacl -b

Equivaut à :
find . -type f -exec setfacl -b {} +
find . -type f -exec setfacl -b {} \;

Uniquement sur les sous-dossiers contenus dans ce dossier
find . -type d -print0 | xargs -0 setfacl -b

Equivaut à :
find . -type d -exec setfacl -b {} +
find . -type d -exec setfacl -b {} \;

 

Créer une arborescence à partir d’une liste de référence

cat reffilename | xargs -L 1 mkdir -p

Equivaut à :
for d in $(cat reffilename); do mkdir -p $d; done
ex :
Avec le fichier référence listing.txt contenant :

essai/dir1/
essai/dir2/machin/
truc/rep1/bidule/
# cat listing.txt | xargs -L 1 mkdir -p
# tree essai truc
essai
├── dir1
└── dir2
    └── machin
truc
└── rep1
    └── bidule

5 directories, 0 files

 

Exécuter grep en sortie de la commande find

find -type f path -print0 | xargs -0 grep "pattern"

ex :

# find . -type f -print0 | xargs -0 grep "Curabitur"
./file1.txt:Curabitur ullamcorper ultricies nisi.
./file1.txt:Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.
./file3.txt:Curabitur ullamcorper ultricies nisi.
./file3.txt:Curabitur ligula sapien, tincidunt non, euismod vitae, posuere imperdiet, leo.
find path ! -regex ".*/\..*" -print0 | xargs -0 grep "pattern"

Cette dernière commande exclura les fichiers et dossiers cachés du résultat.

 

Modifier les droits récursivement uniquement sur les fichiers

find . -type f -print0 | xargs -0 chmod -c 644

Equivaut à :
find . -type f -exec chmod -c 644 {} +
find . -type f -exec chmod 644 {} \;
Les droits sont à adapter aux besoins évidemment, tout comme le répertoire passé en argument de la commande find.

 

Modifier les droits récursivement uniquement sur les dossiers

find . -type d -print0 | xargs -0 chmod -c 755

Equivaut à :
find . -type d -exec chmod -c 755 {} +
find . -type d -exec chmod -c 755 {} \;
Les droits sont à adapter aux besoins évidemment, tout comme le répertoire passé en argument de la commande find.

 

Utiliser un fichier en entrée de la commande apt

xargs apt -y action < file

Le fichier en entrée contient une liste des paquets séparés par un retour charriot.
Equivaut à :
xargs aptitude -y action < file
xargs apt-get -y action < file
ex :

# xargs apt -y install < pkglist.txt

 

Utiliser un fichier en entrée de la commande apt-get

xargs apt-get -y action < file

Le fichier en entrée contient une liste des paquets séparés par un retour charriot.
Equivaut à :
xargs aptitude -y action < file
xargs apt -y action < file
ex :

# xargs apt-get -y install < pkglist.txt

 

Utiliser un fichier en entrée de la commande aptitude

xargs aptitude -y action < file

Le fichier en entrée contient une liste des paquets séparés par un retour charriot.
Equivaut à :
xargs apt -y action < file
xargs apt-get -y action < file
ex :

# xargs aptitude -y install < pkglist.txt

 

Recherche avec listing détaillé du résultat en sortie

find path -print0 | xargs -0 ls -dils

Equivaut à :
find path -ls
find path -exec ls -dils {} \;
find path -exec ls -dils {} +

 

Déplacer plusieurs types de fichiers

find . -type f \( -name "*.jpg" -o -name "*.png" \) -print0 | xargs -0 mv -t destination/

Tout résultat en entrée de xargs est déplacé dans le dossier cible (-t pour target).

 

Copier plusieurs types de fichiers

find . -type f \( -name "*.jpg" -o -name "*.png" \) -print0 | xargs -0 cp -t destination/

Tout résultat en entrée de xargs est copié dans le dossier cible (-t pour target).

find . -type f \( -name "*.jpg" -o -name "*.png" \) -print0 | xargs -0 -I {} cp {} destination/

Chaque fichier trouvé est passé à xargs et identifié par cette dernière commande par le pattern {}

 

Copier plusieurs types de fichiers en les renommant

find . -type f \( -name "*.jpg" -o -name "*.png" \) -print0 | xargs -0 -I {} cp {} destination/{}.old

Chaque fichier trouvé sera renommé sur la destination avec un suffixe .old

 

Renommer un fichier comportant des espaces en l’identifiant par son inode

find path -inum inode -print0 | xargs -0 -I {} mv {} newfilename

ex :

# find . -inum 796271
./fichier test avec des espaces.txt
# find . -inum 796271 -print0 | xargs -0 -I {} mv {} fichier_test_avec_des_underscores.txt
# find . -inum 796271
./fichier_test_avec_des_underscores.txt

 

Exécuter une commande en sortie de la commande ls

ls files/directories | xargs command

ex :

# ls -1 *.txt | xargs

Ceci affiche la liste des fichiers sur une seule ligne

# ls -1 *.txt | xargs -n 2

Ceci affiche la liste des fichiers 2 par 2.

# ls -1 *.txt | xargs wc -l

Ceci affiche le nombre de lignes de chaque fichier texte.

Fermer le menu
%d blogueurs aiment cette page :