Table des matières
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:-inamepermet de rechercher par nom de fichier sans tenir compte de la casse.-print0permet 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:-0ou--nullpermet d'interpréter le caractère NUL utilisé comme délimiteur.-n1ou--max-args=1permet de limiter le nombre de fichier transmis à 1 car dans notre cas, tar ne supporte qu'un seul paramètre.-rou--no-run-if-emptypermet de ne pas lancer la commande s'il n'y a pas de fichiers à traiter.
- Options de
tar:-zou--gzippermet d'utiliser la compression gzip.-xou--extractpermet d'extraire les fichiers d'une archive.-fou--filepermet 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-inamepermet de rechercher par nom de fichier sans tenir compte de la casse.-print0permet 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
headet detail-n10ou--lines=10permet de prendre les 10 premières lignes.-zou--zero-terminatedpermet d'interpréter le caractère NUL utilisé comme délimiteur.
- Options de
xargs-P10ou--max-process=10permet de limiter le nombre de commande lancées simultanément.-n1ou--max-args=1permet de limiter le nombre de fichier transmis à 1 car dans notre cas, cvlc ne jouera qu'une seule vidéo.-0ou--nullpermet 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--noaudiopermet de couper le son.-Lou--looppermet de jouer la vidéo en boucle.vlc://quitest 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
