Aller au contenu
Administration Linux medium

Maîtriser Find : Recherche Linux efficace

12 min de lecture

Quand on administre des serveurs ou des environnements de dev avec des arborescences profondes, on doit souvent retrouver vite un log énorme, un script perdu ou un répertoire précis. find parcourt le système de fichiers en temps réel et permet de sélectionner des fichiers (nom, type, taille, date, permissions) puis d’agir dessus (afficher, auditer, exécuter une commande, nettoyer).

  • Cibler des fichiers par nom, type, taille, date, permissions
  • Combiner des critères (AND/OR/NOT, parenthèses)
  • Appliquer une action en sécurité (-print → puis -exec/-delete)

find fait partie des commandes de recherche et de traitement de fichiers sous Linux. Chaque outil a sa spécialité :

CommandeSpécialitéQuand l’utiliser
findRechercher des fichiers par attributsTrouver par nom, taille, date, permissions
locateRecherche ultra-rapide par nomQuand la vitesse prime (base indexée)
grepRechercher dans le contenuTrouver une chaîne dans des fichiers
which / whereisLocaliser des exécutablesTrouver où est installé un programme
xargsExécuter des commandes en massePasser les résultats de find à une commande
awkTraiter des données tabulairesExtraire/transformer des colonnes
sedÉditer des fichiers en fluxRemplacer du texte, supprimer des lignes
cutExtraire des colonnesDécouper par délimiteur ou position

Combinaisons fréquentes :

Fenêtre de terminal
# find + grep : chercher un motif dans certains fichiers
find /var/log -name '*.log' -exec grep -l "error" {} +
# find + xargs : traitement en masse (robuste avec espaces)
find . -name '*.tmp' -print0 | xargs -0 rm -f
# locate + grep : filtrer les résultats de locate
locate '*.conf' | grep nginx

🧠 Modèle mental — Comment fonctionne find

find = Où chercher → Quoi garder → Quoi faire

Modèle mental find : Où chercher (dossier) → Quoi garder (filtres -name, -type, -size) → Quoi faire (actions -print, -delete, -exec)

Points clés

  • find parcourt un dossier et tous ses sous-dossiers
  • Il garde les fichiers qui matchent tes critères (nom, type, date, taille)
  • Plusieurs critères = ET (les deux doivent matcher)
  • Si tu utilises OU (-o), pense aux parenthèses
  • Tu peux exécuter une commande sur les fichiers trouvés (-exec)
  • Tu peux supprimer des fichiers (-delete) MAIS toujours vérifier avant avec -print

Règles d'or

1
Toujours tester avant d'utiliser des commandes destructrices Commence par -print, puis seulement ensuite -delete.
2
Gérer les noms "bizarres" Utilise les wildcards entre quote ou sans mais avec échappement. ex : '*.log' ou \*.log

Vocabulaire essentiel

-name '*.log'
Fichiers dont le nom correspond au motif
-type f / -type d
Fichier (f) ou dossier (d)
-mtime +7
Modifié il y a plus de 7 jours
-size +100M
Taille supérieure à 100 Mo
-maxdepth 2
Ne pas descendre plus de 2 niveaux
-print / -delete
Afficher les résultats / Supprimer
📚 Pour aller plus loin — 12 options avancées
-iname
Comme -name mais insensible à la casse
-path / -ipath
Pattern sur le chemin complet
-mmin -60
Modifié il y a moins de 60 minutes
-perm 644
Permissions exactes
-user / -group
Par propriétaire ou groupe
-prune
Exclure un sous-arbre
-xdev
Ne pas traverser les points de montage
-exec cmd {} \;
Exécuter pour chaque fichier
-exec cmd {} +
Exécuter en batch (plus rapide)
-ok cmd {} \;
Comme -exec avec confirmation
-printf FORMAT
Sortie formatée personnalisée
-quit
Arrêter au premier résultat

Contrairement à locate (index pré-calculé), find ne dépend pas d’une base : le résultat reflète l’état actuel du disque.

Fenêtre de terminal
find [CHEMIN...] [FILTRES...] [ACTIONS...]

La commande find suit toujours la même logique en trois étapes :

ÉtapeQuestionExemplesObligatoire ?
Où chercherDans quel dossier démarrer ?/var/log, ., /home⚠️ Implicite (défaut : .)
Quels résultats garderQuels fichiers correspondent à mes critères ?-name '*.log', -type f, -size +100M❌ Non (par défaut : tout)
Quoi faireQuelle action effectuer sur les résultats ?-print, -delete, -exec rm {} +❌ Non (par défaut : -print)

Où chercher (optionnel) — C’est le point de départ. find va parcourir ce dossier et tous ses sous-dossiers récursivement. Si vous n’indiquez pas de chemin, c’est . qui sera utilisé (le répertoire courant).

Quels résultats garder (optionnel) — Ce sont les filtres. Si vous n’en mettez pas, find retourne tout. Vous pouvez combiner plusieurs critères : par défaut ils sont liés par ET (tous doivent correspondre).

Quoi faire (optionnel) — C’est l’action finale. Sans action explicite, find affiche simplement les chemins (-print). Pour des actions destructrices (-delete, -exec rm), testez toujours avec -print d’abord.

Les filtres permettent de réduire les résultats aux fichiers qui vous intéressent. Voici les plus utilisés :

FiltreCe qu’il testeExemple
-name 'motif'Nom du fichier (sensible à la casse)-name '*.log'
-iname 'motif'Nom du fichier (insensible à la casse)-iname '*.LOG'

⚠️ Toujours mettre le motif entre quotes : -name '*.log'. Sinon le shell interprète * avant find et vous obtenez des résultats inattendus.

FiltreCe qu’il testeExemple
-type fFichiers uniquement-type f
-type dDossiers uniquement-type d
-size +100MTaille supérieure à 100 Mo-size +100M
-size -1kTaille inférieure à 1 Ko-size -1k
-mtime -7Modifié il y a moins de 7 jours-mtime -7
-mtime +30Modifié il y a plus de 30 jours-mtime +30
-user aliceAppartient à l’utilisateur alice-user alice
-perm 644Permissions exactement 644-perm 644
-perm -644Au moins ces bits (lecture/écriture)-perm -644
-perm /222Au moins un bit d’écriture-perm /222

Note sur les tailles : k, M, G sont pratiques mais l’interprétation peut varier selon les implémentations de find. En cas de doute, testez.

Combiner les filtres — ET / OU / NON :

Par défaut, les filtres sont combinés avec ET (tous doivent correspondre) :

Fenêtre de terminal
# Fichiers .log ET de plus de 10 Mo (les deux conditions)
find /var/log -type f -name '*.log' -size +10M

Astuce : ajoutez -type f pour ne matcher que les fichiers (évite le bruit des répertoires).

Pour utiliser OU, ajoutez -o et des parenthèses (échappées) :

Fenêtre de terminal
# Fichiers .log OU .txt
find /var/log -type f \( -name '*.log' -o -name '*.txt' \)

Pourquoi \( et \) ? Le shell interprète les parenthèses nues. On les échappe (\( \)) ou on les met entre quotes ('(' ')').

Pour exclure par nom, utilisez ! ou -not :

Fenêtre de terminal
# Tous les fichiers SAUF ceux commençant par .git
find . -type f ! -name '.git*'

⚠️ Attention : ceci n’exclut PAS le dossier .git/ du parcours ! Pour vraiment ignorer un dossier, utilisez -prune :

Fenêtre de terminal
# Exclure le dossier .git de la recherche (correct)
find . -name .git -prune -o -type f -print

Une fois les fichiers filtrés, vous pouvez agir dessus :

ActionCe qu’elle faitExemple
-printAffiche le chemin (par défaut)-print
-lsAffiche en format ls -l-ls
-deleteSupprime le fichier-delete
-exec cmd {} \;Exécute cmd sur chaque fichier-exec chmod 644 {} \;
-exec cmd {} +Exécute cmd avec tous les fichiers-exec rm {} +

Règle d’or : toujours prévisualiser avant de détruire

Fenêtre de terminal
# ❌ DANGEREUX : supprime directement
find /tmp -name '*.tmp' -delete
# ✅ SÛR : prévisualiser d'abord
find /tmp -name '*.tmp' -print
# Vérifier la liste, puis seulement :
find /tmp -name '*.tmp' -delete

Alternative robuste (gère les espaces et caractères spéciaux dans les noms) :

Fenêtre de terminal
find . -type f -name '*.tmp' -print0 | xargs -0 rm -f

-exec {} \; vs -exec {} + — La différence est importante :

  • \; : lance une commande par fichier (lent si beaucoup de fichiers)
  • + : regroupe les fichiers et lance une seule commande (rapide, recommandé)
Fenêtre de terminal
# Lent : 1000 fichiers = 1000 appels à chmod
find . -type f -exec chmod 644 {} \;
# Rapide : 1000 fichiers = quelques appels à chmod
find . -type f -exec chmod 644 {} +

Par défaut, find parcourt l’arborescence de haut en bas. Deux options modifient ce comportement :

-depth — Traite le contenu d’un dossier avant le dossier lui-même :

Fenêtre de terminal
# Sans -depth : /tmp est listé AVANT son contenu
find /tmp -type d
# Avec -depth : /tmp est listé APRÈS son contenu
find /tmp -depth -type d

C’est automatique avec -delete pour éviter de supprimer un dossier avant son contenu.

-pruneStoppe la descente dans un dossier (utile pour exclure des répertoires) :

Fenêtre de terminal
# Exclure le dossier node_modules de la recherche
find . -name 'node_modules' -prune -o -name '*.js' -print
# Exclure plusieurs dossiers
find . \( -name 'node_modules' -o -name '.git' \) -prune -o -type f -print

Comment lire -prune : “Si tu trouves ce dossier, ne descends pas dedans (-prune), sinon (-o) applique le reste.”

OptionEffetCas d’usage
-depthTraite enfants avant parentsSuppression récursive
-pruneN’entre pas dans le dossierExclure node_modules, .git
-maxdepth NLimite la profondeurfind . -maxdepth 1 (niveau courant)
-mindepth NIgnore les N premiers niveauxfind . -mindepth 2 (sous-dossiers)

Exemples pratiques :

Fenêtre de terminal
# Lister uniquement le contenu immédiat (pas de récursion)
find /var/log -maxdepth 1 -type f -name '*.log'
# Chercher à partir du 2e niveau (ignorer le dossier racine)
find . -mindepth 2 -type f -name '*.conf'
# Combiner les deux : chercher entre le niveau 2 et 4
find /home -mindepth 2 -maxdepth 4 -type d -name '.ssh'
# Supprimer des dossiers vides (depth nécessaire pour traiter enfants d'abord)
find /tmp -depth -type d -empty -delete
# Lister les fichiers du niveau courant uniquement (équivalent de ls)
find . -maxdepth 1 -type f
ErreurCauseSolution
find -name *.log ne trouve rienLe shell a interprété * avant findMettre entre quotes : -name '*.log'
-o ne fonctionne pas comme prévuPriorité des opérateursAjouter des parenthèses : \( ... -o ... \)
”J’ai exclu .git mais find cherche dedans”! -name n’empêche pas la descenteUtiliser -prune : -name .git -prune -o ...
Résultats incluent des répertoiresPas de filtre -typeAjouter -type f pour les fichiers uniquement

Maintenant que vous avez une bonne comprendre de la commande find, voici des modèles courants pour des recherches et traitements fréquents.

Ces recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.

Recherche par nom exact Base

Trouver un fichier quand on connaît son nom précis.

find /var/log -name "syslog"
Formule find <chemin> -name "<nom>"
Exemple
find /var/log -name "syslog"
Paramètres
  • chemin — Point de départ de la recherche
  • nom — Nom exact ou pattern glob
Recherche par pattern (glob) Base

Trouver des fichiers par extension ou motif.

find . -name "*.log"
Formule find <chemin> -name "*.ext"
Exemple
find . -name "*.log"
Paramètres
  • ext — Extension recherchée
  • * — Wildcard : n'importe quels caractères
Filtrer par type Base

Restreindre aux fichiers, dossiers ou liens.

find /etc -type d -name "*.d"
Formule find <chemin> -type <f|d|l>
Exemple
find /etc -type d -name "*.d"
Paramètres
  • f — Fichier régulier
  • d — Dossier
  • l — Lien symbolique
Filtrer par taille Base

Trouver les gros fichiers ou les fichiers vides.

find /var/log -type f -size +100M
Formule find <chemin> -type f -size <+|->N<c|k|M|G>
Exemple
find /var/log -type f -size +100M
Paramètres
  • +/- — + = plus grand, - = plus petit
  • N — Nombre
  • unité — c=octets, k=Ko, M=Mo, G=Go
Éviter si : Fichiers très petits : préférer -empty
Filtrer par date de modification Base

Trouver les fichiers récents ou anciens.

find /tmp -type f -mtime +30
Formule find <chemin> -mtime <+|->N
Exemple
find /tmp -type f -mtime +30
Paramètres
  • +N — Modifié il y a plus de N jours
  • -N — Modifié il y a moins de N jours
  • N — Modifié il y a exactement N jours
Exécuter une commande (-exec) Inter.

Lancer une commande pour chaque fichier trouvé.

find . -name "*.bak" -exec rm {} \;
Formule find <chemin> <tests> -exec <cmd> {} \;
Exemple
find . -name "*.bak" -exec rm {} \;
Paramètres
  • {} — Placeholder pour le nom du fichier
  • \; — Fin de la commande (échappé)
Éviter si : Gros volumes : préférer -exec ... + ou xargs
Alternative : find ... -exec cmd {} + (batch mode)
Exécuter en batch (-exec +) Inter.

Passer plusieurs fichiers à une seule commande.

find . -name "*.txt" -exec wc -l {} +
Formule find <chemin> <tests> -exec <cmd> {} +
Exemple
find . -name "*.txt" -exec wc -l {} +
Paramètres
  • + — Agrège les fichiers (comme xargs)
Pipeline sécurisé avec xargs -0 Inter.

Gérer les noms avec espaces et caractères spéciaux.

find . -name "*.pdf" -print0 | xargs -0 mv -t ~/backup/
Formule find <chemin> <tests> -print0 | xargs -0 <cmd>
Exemple
find . -name "*.pdf" -print0 | xargs -0 mv -t ~/backup/
Paramètres
  • -print0 — Sépare par NUL au lieu de newline
  • -0 — xargs lit le format NUL
Suppression sécurisée Avancé

Supprimer des fichiers après validation.

find /tmp -type f -mtime +30 -delete
Formule find <chemin> <tests> -print # puis -delete
Exemple
find /tmp -type f -mtime +30 -delete
Paramètres
  • -print — Étape 1 : visualiser
  • -delete — Étape 2 : supprimer
Éviter si : JAMAIS -delete sans avoir fait -print avant
Exclure un dossier (-prune) Avancé

Ignorer certains sous-dossiers de la recherche.

find . -path "./node_modules" -prune -o -name "*.js" -print
Formule find <chemin> -path "*/<dossier>" -prune -o <tests> -print
Exemple
find . -path "./node_modules" -prune -o -name "*.js" -print
Paramètres
  • -path — Pattern sur le chemin complet
  • -prune — Arrête la descente dans ce dossier
  • -o — OU : applique les tests aux autres

Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.

Noms de fichiers avec espaces

find . -name "*.txt" | xargs rm casse sur "mon fichier.txt"

Danger
Le piège : find . -name "*.txt" | xargs rm casse sur "mon fichier.txt"
Symptôme : Erreur "No such file" ou suppression de mauvais fichiers
Cause : xargs découpe sur les espaces par défaut
Correction : Utiliser -print0 | xargs -0
find . -name "*.txt" -print0 | xargs -0 rm
→ Voir le pattern qui résout
-delete sans vérification

find /var -name "*.tmp" -delete exécuté directement

Danger
Le piège : find /var -name "*.tmp" -delete exécuté directement
Symptôme : Fichiers importants supprimés par erreur
Cause : Le pattern était trop large ou mal formulé
Correction : TOUJOURS faire -print d'abord, puis remplacer par -delete
find /var -name "*.tmp" -print  # vérifier, puis -delete
→ Voir le pattern qui résout
OU sans parenthèses

find . -name "*.log" -o -name "*.txt" -mtime +7

Attention
Le piège : find . -name "*.log" -o -name "*.txt" -mtime +7
Symptôme : -mtime ne s'applique qu'aux .txt, pas aux .log
Cause : La précédence fait que -mtime est groupé avec le second -name
Correction : Grouper avec des parenthèses échappées
find . \( -name "*.log" -o -name "*.txt" \) -mtime +7
Recherche sensible à la casse

find -name "Report.txt" ne trouve pas "report.txt"

Info
Le piège : find -name "Report.txt" ne trouve pas "report.txt"
Symptôme : La recherche ne retourne rien alors que le fichier existe
Cause : -name est sensible à la casse par défaut
Correction : Utiliser -iname pour une recherche insensible à la casse
find . -iname "report.txt"
Confusion mtime/ctime/atime

Utiliser -mtime pour trouver des fichiers "créés" récemment

Info
Le piège : Utiliser -mtime pour trouver des fichiers "créés" récemment
Symptôme : Résultats inattendus : fichiers copiés apparaissent comme vieux
Cause : mtime = modification du contenu, pas création. Linux n'a pas de "date de création"
Correction : -mtime pour le contenu, -ctime pour les métadonnées, -atime pour l'accès
Regex au lieu de glob

find . -name ".*\.log$" ne fonctionne pas

Info
Le piège : find . -name ".*\.log$" ne fonctionne pas
Symptôme : Aucun résultat
Cause : -name utilise des globs (*, ?), pas des regex
Correction : Utiliser -regex pour les expressions régulières
find . -regex ".*\.log$"  # ou simplement -name "*.log"

📋 Cheatsheet find

📝 Syntaxe :

find [chemin] [filtres] [actions] Format général de la commande

🚀 Commandes types :

Recherche par nom exact Trouver un fichier quand on connaît son nom précis.
find /var/log -name "syslog"
Recherche par pattern (glob) Trouver des fichiers par extension ou motif.
find . -name "*.log"
Filtrer par type Restreindre aux fichiers, dossiers ou liens.
find /etc -type d -name "*.d"
Filtrer par taille Trouver les gros fichiers ou les fichiers vides.
find /var/log -type f -size +100M
Filtrer par date de modification Trouver les fichiers récents ou anciens.
find /tmp -type f -mtime +30

⚙️ Options

-maxdepth N Limite la profondeur de recherche find . -maxdepth 2 -name "*.txt"
-mindepth N Ignore les N premiers niveaux find . -mindepth 1 -type d
-L Suit les liens symboliques find -L /opt -name "*.conf"
-xdev Reste sur le même système de fichiers find / -xdev -size +100M

🔍 Filtres

-name "*.ext" Nom avec glob (sensible casse) -name "*.log"
-iname "*.ext" Nom avec glob (insensible casse) -iname "*.JPG"
-type f Fichiers uniquement -type f
-type d Dossiers uniquement -type d
-path "*pattern*" Pattern sur le chemin complet -path "*/test/*"

📅 Temps

-mtime +7 Modifié il y a + de 7 jours -mtime +30
-mtime -1 Modifié il y a - de 1 jour -mtime -7
-newer fichier Plus récent que fichier -newer ref.txt

📏 Tailles

-size +100M Plus grand que 100 Mo -size +1G
-size -1k Plus petit que 1 Ko -size -100c
-empty Fichiers/dossiers vides -type f -empty

🔐 Permissions

-perm 644 Permissions exactes -perm 755
-perm -u+x Au moins exécutable user -perm -g+w
-user bob Appartient à bob -user root

⚡ Actions

-print Affiche (défaut) -print
-print0 Affiche séparé par NUL -print0 | xargs -0
-exec cmd {} \; Exécute cmd pour chaque -exec rm {} \;
-exec cmd {} + Exécute cmd en batch -exec ls {} +
-delete Supprime -mtime +30 -delete

🔗 Composition

-a ET (implicite) -name "*.log" -a -size +1M
-o OU -name "*.jpg" -o -name "*.png"
\( ... \) Groupement \( -name "*.jpg" -o -name "*.png" \)
-prune Exclure un sous-arbre -path "./vendor" -prune

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

La commande find est un outil essentiel pour quiconque travaille régulièrement en ligne de commande. Grâce à sa souplesse et à sa richesse fonctionnelle, elle permet de retrouver, filtrer et manipuler efficacement des fichiers dans n’importe quelle arborescence. Que ce soit pour une recherche rapide, un nettoyage automatisé ou un audit de permissions, la maîtrise de find fait gagner un temps précieux et renforce la qualité de vos scripts et interventions système.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.