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
Structure de la commande find
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. Quatre 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 {} \;
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 dans tous les fichiers php le mot maur quelquesoit sa casse :
find . -name *.php -type f -exec grep -Hni --color=auto 'maur' {} \;
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' \)
rechercher le mot maur quelquesoit sa casse dans tous les fichiers sauf les fichiers ayant l’extension .pdf, .jpg, .png, .gif, .jpeg
find . -type f \( -iname "*" ! -iname "*.pdf" ! -iname "*.jpg" ! -iname "*.png" ! -iname "*.gif" ! -iname "*.jpeg" \) -exec grep -Hni --color=auto 'maur' {} \;
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