Apr 11 2010

Exemples d’utilisation courante de la commande find (shell UNIX/Linux)

Voici quelques exemples courants d'utilisation de la commande find.
Les expressions en CAPITALE sont à adapter.

Trouver les fichiers modifiés récemment

Fichiers modifiés il y a moins de 24 heures

find . -mtime 0
  

Fichiers modifiés il y a plus de 24 heures

find . -mtime +0
  

Fichiers modifiés il y a moins de 10 minutes

find . -mmin -10
  

Fichiers modifiés entre 24 heures et 48 heures

find . -mtime 1
  

Fichiers modifiés il y a plus de 48 heures

find . -mtime +1
  

Fichiers modifiés entre 1 et 5 minutes

find . -mmin +0 -mmin -5
  

Trouver les fichiers ayant une permission spécifique

Par exemple, les fichiers inscriptibles par tous.
find . -type f -perm -o=w
  

Chercher une chaîne dans tous les fichiers récursivement

find . -type f -print0 | xargs -0 -e grep -niH -e 'STRING'
  
(Sous Emacs, il suffit de faire M-x grep-find⏎)
Le -print0 en conjonction avec xargs -0 permet de gérer les espaces et les retour à la ligne dans les noms de fichiers. Voici la sortie du code dans le répertoire contenant cet article.
find . -type f -print0 | xargs -0 -e grep -niH -e 'supprimer'
./article.php:12:<h2>Supprimer les fichiers cachés</h2>
./article.php:15:<h2>Supprimer tous les répertoires vides</h2>
./article.php:22:<h2>Supprimer les répertoires <i>svn</i> d'un dépôt</h2>
  

Supprimer les fichiers cachés

find -type f -name '.*' -exec rm {} \;
  

Supprimer tous les répertoires vides

find . -type d -empty -print -exec rmdir -f {} \;
  

Supprimer les répertoires svn d'un dépôt

find PATH -type d -regex '.*\.svn' -print0 | xargs -0 rm -rf
  

Utiliser le « ou » dans find

find -type f \( -name "*.EXT1" -o -name "*.EXT2" \)
  

Remplacer une chaine dans plusieurs fichiers

Tous fichiers, sans limite de profondeur

find ./ -type f -exec sed -i 's/OLD/NEW/' {} \;
  

Profondeur donnée et le nom vérifie une expression rationnelle

find ./ -maxdepth PROFONDEUR -type f -name "REGEXP" -exec sed -i 's/OLD/NEW/g' -- {} \;
  

Exécuter un script dans tous les répertoires et sous-répertoires

find . -type d -exec sh -c 'cd "$0" && /PATH/SCRIPT' '{}' ';'
  

Boucler sur des fichiers/répertoires

Tous les sous-répertoires récursivement

find . -type d ! -name . -print | while read dir; do
  # code
done
  

Tous les fichiers récursivement

find . -type f -print | while read dir; do
  # code
done
  

Exécuter un script sur tous les fichiers contenant une expression

EXPRESSION peut être une expression rationnelle si l'on remplace grep -lq par grep -lqE (évidemment).
find -type f -exec grep -lq "EXPRESSION" {} \; -print | \
while read file; do
  SCRIPT "$file"
done
  

Compresser tous les répertoires courants

find -maxdepth 1 -type d ! -name "." -exec sh -c 'zip -r $0.zip $0' '{}' ';'
  

Archiver et compresser récursivement les fichiers de tous les répertoires

On supposera qu'il n'y a pas de retour à la ligne dans le nom des fichiers
find . -type d -print | \
while read dir; do
    (
        cd "$dir" || exit
        find . -maxdepth 1 -type f ! -name archive.tgz -print | \
            pax -w | gzip > archive.tgz
    )
done
  

Afficher les vingt répertoires les plus lourds de l'arborescence en cours

Les fichiers seront classés du plus lourd au moins lourd et les tailles sont données en ko.
find . -type d ! -name . -prune -exec du -sk {} \+ | sort -nr | tail -n 20
  

Recopier hiérarchiquement un ensemble de fichiers

Dans l'exemple suivant, les fichiers d'extension sh présents dans toute l'arborescence de SOURCE_PATH seront recopié dans le répertoire DEST_PATH (qui doit exister) en conservant arborescence d'origine.
find SOURCE_PATH -name '*.sh' | xargs cp -a --target-directory=DEST_PATH --parents
  

Ignorer un répertoire ainsi que tous les fichiers et répertoires s'y trouvant

Ceci est un exemple extrait de la page man de find, il permet d'ignorer tout ce qui se trouve dans PATH.
find . -path PATH -prune -o -print
  

Pour ignorer plusieurs répertoires ?
find . \( -path ./DIR_A -prune -o -path ./DIR_B \) -prune -o -print