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
:-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 detail
-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