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

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

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