Outils pour utilisateurs

Outils du site


informatique:find_xargs

Find & xargs

Find est un outil permettant de rechercher des fichiers sur le disque.
Xargs est un outil qui permet de construire des commandes depuis l'entrée standard. L'intérêt de cette commande est de respecter la longueur maximale de la commande. Par exemple :

# Si le nombre de fichier est très important, la commande suivante sera interrompu par des erreurs
rm -Rf ./*
 
# Il faut donc utiliser la commande suivante
find . | xargs rm -Rf

Décompresser plusieurs fichiers

# Version courte
find . -iname \*tar.gz -print0 | xargs -0 -n1 -r tar -zxf
 
# Version longue
find . -iname \*tar.gz -print0 | xargs --null --max-args=1 --no-run-if-empty tar --gzip --extract --file
  • Options de find :
    • -iname permet de rechercher par nom de fichier sans tenir compte de la casse.
    • -print0 permet d'afficher la liste des fichiers séparés par un caractère NUL au lieu d'un caractère de fin de ligne. Cela permet de gérer les fichiers contenant des espaces dans leur nom.
  • Options de xargs :
    • -0 ou --null permet d'interpréter le caractère NUL utilisé comme délimiteur.
    • -n1 ou --max-args=1 permet de limiter le nombre de fichier transmis à 1 car dans notre cas, tar ne supporte qu'un seul paramètre.
    • -r ou --no-run-if-empty permet de ne pas lancer la commande s'il n'y a pas de fichiers à traiter.
  • Options de tar :
    • -z ou --gzip permet d'utiliser la compression gzip.
    • -x ou --extract permet d'extraire les fichiers d'une archive.
    • -f ou --file permet d'utiliser un fichier archive.

Bien sur il faut faire correspondre les options de tar avec les fichiers recherchés.

Changer l'utilisateur de fichiers (y compris les fichiers point)

Si on utilise la commande chown directement, les fichiers point (ou dotfiles en anglais) ne sont pas modifiés à moins de les sélectionner un par un. Si on n'en a qu'un a modifier, ce n'est pas un vrai problème. Dans le cas contraire, cela risque d'être contraignant.

Pour pallier à ça, il suffit de lancer la commande suivante :

find . -user <utilisateur> | xargs chown -R <utilisateur>

Et ça fonctionne de la même façon pour les groupes :

find . -group <groupe> | xargs chgrp -R <groupe>

Lancer plusieurs vidéos simultanément

# Version courte
find . -iname \*mp4 -print0 | xargs -P10 -n1 -0 cvlc --noaudio --L
 
# Version longue
find . -iname \*mp4 -print0 | xargs --max-process=10 --max-args=1 --null cvlc --noaudio --loop
 
# Version courte filtrée
find . -iname \*mp4 -print0 | head -n10 -z | tail -n6 -z | xargs -P10 -n1 -0 cvlc --noaudio --L
 
# Version longue filtrée
find . -iname \*mp4 -print0 | head --lines=10 --zero-terminated | tail --lines=6 --zero-terminated | xargs --max-process=10 --max-args=1 --null cvlc --noaudio --loop
# Par défaut, xargs positionne les arguments reçus en fin de ligne.
# Pour utiliser les arguments à un autre endroit, il faut utiliser une chaine de remplacement. Ici, {}
find . -iname \*mp4 -print0 | xargs -P10 -n1 -0 -I '{}' cvlc --noaudio {} vlc://quit
  • Options de find
    • -iname permet de rechercher par nom de fichier sans tenir compte de la casse.
    • -print0 permet d'afficher la liste des fichiers séparés par un caractère NUL au lieu d'un caractère de fin de ligne. Cela permet de gérer les fichiers contenant des espaces dans leur nom.
  • Options de head et de tail
    • -n10 ou --lines=10 permet de prendre les 10 premières lignes.
    • -z ou --zero-terminated permet d'interpréter le caractère NUL utilisé comme délimiteur.
  • Options de xargs
    • -P10 ou --max-process=10 permet de limiter le nombre de commande lancées simultanément.
    • -n1 ou --max-args=1 permet de limiter le nombre de fichier transmis à 1 car dans notre cas, cvlc ne jouera qu'une seule vidéo.
    • -0 ou --null permet d'interpréter le caractère NUL utilisé comme délimiteur.
    • -I '{}' permet de remplacer la chaine {} par les arguments reçus.
  • Options de cvlc
    • --noaudio permet de couper le son.
    • -L ou --loop permet de jouer la vidéo en boucle.
    • vlc://quit est un nom de fichier factice qui permet de quitter vlc.

Supprimer tous les répertoires vides du répertoire courant

# Du répertoire courant uniquement
find . -maxdepth 1 -type d -empty -delete
 
# Récursivement, un répertoire ne contenant que des répertoires vides sera supprimé
find . -type d -empty -delete

Il est impératif de positionner -maxdepth 1 au début pour ne pas avoir d'alerte. En effet, maxdepth est une option et de ce fait doit être positionné avant les tests. Ici type et empty

Lancer plusieurs commandes

find . | xargs -n1 -I '{}' sh -c "<command> {}; <command> {}"

Afficher l'ensemble des fichiers en excluant certains répertoires

find . -not -path "./vendor/*" -not -path "./var/*" -not -path "./hooks/*" -print
informatique/find_xargs.txt · Dernière modification: 2018/03/23 09:40 de alexis