Find

De drev
Aller à : navigation, rechercher

synopsis

find <PATH> -name "regexp"

Options essentielles

type

  • -type d pour ne chercher que les répertoires
  • -type f pour ne chercher que les fichiers


Exemple : lister les reprtoires

find -name "*" - type d

maxdepth

limiter la récursions

find -name "*" -maxdepth 1

-exec

exécute une commande avec chaque résultats de find

{} représente les résultats de find

\; doit terminer l'expression

-grep

permet de chercher dans les fichiers (voir grep)

  • -i insensible à la casse
  • -H, --with-filename Afficher le nom du fichier pour chaque concordance.
  • -n, --line-number Ajouter à chaque ligne de sortie un préfixe contenant son numéro dans le fichier.

Cas pratique

rechercher dans une arborescence et afficher le fichier et la ligne

find "/var/www" -name "*.php" -type f -exec grep -Hn "class" {} \;

Afficher le total de la recherche en MB

find ./berserk/*.epub -ls |  awk '{total += $7} END {print total / 1000000}'

Renommer en masse

 find . -name "*.zip" -exec rename -v 's/\.zip$/\.cbz/' {} +

Lister les répertoires "feuilles"

find . -type d -links 2 


Limiter la profondeur de la recherche

find . -type d -maxdepth 1

zipper une arborescence

find . -type d -exec zip -r {}.cbz {} \;

zipper les répertoires sans recrutions

find . -type d -maxdepth 1  -exec zip -r {}.zip {} \;

Exclusion de répertoire

mkdir a b c d e
find * -maxdepth 0 -name "[abc]" -prune -o -exec echo {} \;
d
e

Rechercher plusieurs extensions

find -regex '.*\.\(zip\|gz\)'
 

boucler sur chaque resultat de find

find . -name '*.txt' | while read line; do
    echo "Processing file '$line'"
done

source https://stackoverflow.com/a/2087038/2323803

find basename

find . -exec sh -c 'echo $(basename "{}")' \