Exemples utilisation find linux

La commande find est l’une des instructions que j’ai le plus utilisées lorsque j’ai commencé à Administrer des serveurs dédiés.

  • Où est le fichier de configuration de Apache sur une distribution Gentoo ?
  • Où est le fichier de gestion des DNS sous Debian avec un Plesk ??

Sur le net, on trouve des éléments de réponse mais c’est toujours proche mais pas toujours exact !

Voici donc un petit bloc note sur la commande find : comment l’utiliser et surtout pleins d’exemple à copier-coller dans Putty.

Version de find

Cet article a été réalisé avec «find» de GNU version 4.1.20

Structure de la commande find

find Chemin Critère Option

La commande find dispose de trois parties :

# Partie de cmd find Présentation
1 Chemin Chemin du dossier où la recherche doit être effectuée.
Le chemin peut être absolu ou relatif.
Si le chemin est absent de la commande, la recherche se fait à partir du dossier en cours et ses sous-dossiers
2 Critère liste des critères à donner à find pour orienter la recherche.
Il y en a plein, ils peuvent s’additionner et se combiner comme vous aller le voir dans la suite de l’article.
Il est enfin possible d’utiliser des wildcards pour augmenter la capacité de recherche.
3 Option Cette dernière partie est facultative mais très puissante. Trois options sont possibles :

  • -print : par défaut, signifie affiche le résultat dans le shell
  • -printf : permet de formater le résultat retourné par la commande
  • -exec : exécuter une commande sur liste retournée par find, la suite de l’article présente des manières d’utiliser cette option très intéressante
  • -ok : comme -exec mais demande une confirmation pour chaque élément de la liste trouvé

10 Principaux critères de la commande find :

# Critère Signification
1 -name Recherche par nom de fichier, mettre le nom entre quote simple ou double quote.
2 -iname identique à -name mais sans différencier les majuscules et les minuscules.
3 -type Recherche par type de fichier, d pour directory, f pour file et l pour link.
4 -user Recherche par propriétaire.
5 -group Recherche par appartenance à un groupe.
6 -size Recherche par taille de fichier. pattern attendu : [-|+]n[cwbkMG]
7 -daystart Recherche par sur une période : -amin, -atime, -cmin, -ctime (Recherche par date de création), -mmin, and -mtime (Recherche par date de dernière modification). utilisation de + et – pour rechercher au delà ou moins que le chiffre mentionné
8 -maxdepth / -mindepth profondeur maximum / minimum de recherche dans les dossiers
9 -perm Recherche par autorisations d’accès. utilisation de + et – pour rechercher au delà ou moins que le chiffre mentionné
10 -links Recherche par nombre de liens au fichier.

Rechercher et afficher le plus d’informations :

find dir/ -name "*sh" -exec ls -al {} \;

si jamais find trouve un dossier se terminant par sh, la commande va afficher le contenu du dossier en + des fichiers qui vérifient la condition 😯

Rechercher et changer le chmod :

pour les dossiers :

find dir/ -type d -exec chmod 755 {} \;

pour les fichiers :

find dir/ -type f -exec chmod 644 {} \;

pour wordpress :

find dir/ -type d -exec chmod 750 {} \;
find dir/ -type f -exec chmod 640 {} \;
find dir/ -type f -name 'wp-config.php' -exec chmod 600 {} \;
find dir/ -type f -name '.htaccess' -exec chmod 644 {} \;
find dir/ -perm 777 # permet de vérifier qu'il n'y a pas de dossiers ou de fichiers en 777

Recherche de dossiers et fichiers vides

Dossier :

Commande Equivalent
find dir/ -type d -empty
find dir/ -type d -size 0

Fichier :

Commande Equivalent
find dir/ -type f -empty
find dir/ -type f -size 0

Recherche par permission

Fichier :

Commande Equivalent
find dir/ -perm 755 -print
find dir/ -perm -020 -print

Rechercher de texte dans tous les fichiers :

Commande Equivalent Equivalent
find dir/ -type f -exec grep -H 'string' {}\;
grep -R 'string' dir/
 find dir/ -name '*' | xargs grep 'string'

Rechercher et Supprimer :

Supprimer récursivement tous les fichiers .php dans un dossier particulier :

find dir/ -name "*.php" -exec rm -rf "{}" \;

Supprimer récursivement tous les fichiers « WILDCARDNAME » créé il y a plus de 3 jours dans un dossier particulier :

find dir/ -name "WILDCARDNAME" -type f -mtime +3 -ok rm {} \;

Rechercher et dézipper en masse :

find dir/ -name "*.odt" -exec sh -c 'unzip -c "{}" content.xml | grep -qi "saint valentin"' ";" -print

Recherche sur une période :

Rechercher tous les fichiers modifiés depuis 20 jours :

find dir/ -mtime -20 -type f

Rechercher tous fichiers modifiés entre 1 et 5 minutes :

find dir/ -mmin +0 -mmin -5

Rechercher tous fichiers modifiés il y a moins de 24 heures :

find dir/ -mtime 0

Rechercher tous fichiers modifiés il y a plus de 24 heures :

find dir/ -mtime +0

Rechercher tous fichiers modifiés entre 24 heures et 48 heures :

find dir/ -mtime 1

Recherche avec caractère d’association

Pour associer plusieurs critères avec -a pour et, -o pour ou, ! pour négation.

Affiche tous les fichiers n’appartenant pas à root :

find dir/ ! -user root -print

Affiche tous les fichiers se terminant par .jpg ou .png :

find dir/ \( -name '*.jpg' -o -name '*.png' \)

Wildcards – quote et double quote :

Dans tous les articles que j’ai lu, il est mentionné que l’utilisation des doubles quotes permet au Wildcard au shell de les interpréter. Par contre, si l’on utilise les quotes simples, là le shell ne fait pas la correspondance .

Mais dans les faits, je constate que ces deux commandes donnent le même résultat :

Avec quote double Avec quote simple
find -name "[a-b]*" -type f -exec ls -tl {} \;
find -name '[a-b]*' -type f -exec ls -tl {} \;

Ai je mal compris ?

Ce n’est que le début …

Pour finir cet article, je viens de parcourir le man de la commande find et comme le montre la documentation, find dispose d’autres actions et d’autres critères qui permettent de réaliser des recherches très fines.

Cet article n’est donc qu’un aperçu pratique des commandes que j’utilise au quotidien. Des milliers d’autres combinaisons sont possibles

La page suivante vous donne un équivalent du man en version web.

Aller plus loin :

Un deuxième article vient d’être réalisé sur le sujet pour réaliser des opérations plus complexes grâce à find