Maitriser la commande find
Mise à jour :
Quand on gère des serveurs ou des environnements de développement aux
arborescences complexes, il devient vite indispensable de pouvoir retrouver
rapidement un fichier de log volumineux, un script oublié, ou un répertoire de
projet égaré. La commande find
permet de fouiller efficacement dans
l’arborescence d’un système de fichiers, selon des critères comme le nom, la
taille, la date de modification ou encore les permissions. La maîtriser, c’est
gagner du temps au quotidien et éviter de perdre des heures à naviguer
manuellement dans des dossiers imbriqués.
Introduction à find
La commande find
est l’un des outils les plus puissants et polyvalents
pour rechercher des fichiers et répertoires sous Linux. Contrairement à des
outils comme locate
, qui s’appuie sur une base de données mise à jour
périodiquement, find
effectue une recherche en temps réel dans le système de
fichiers.
Elle permet non seulement de localiser des fichiers par nom, mais aussi selon une multitude de critères :
- type de fichier (fichier, dossier, lien, etc.),
- taille,
- date de dernière modification ou d’accès,
- propriétaire ou groupe,
- permissions,
- et même d’exécuter une action automatique sur chaque fichier trouvé.
Par exemple, pour trouver tous les fichiers .log
de plus de 100 Mo dans
/var/log
:
find /var/log -type f -name "*.log" -size +100M
Ou encore, pour supprimer tous les fichiers temporaires de plus de 7 jours :
find /tmp -type f -mtime +7 -exec rm -f {} \;
Avec find
, on peut automatiser des nettoyages, des audits, des recherches
ciblées, ou encore des actions conditionnelles — directement en ligne de
commande, sans devoir écrire un script complet.
Syntaxe de base
La commande find
repose sur une syntaxe très flexible qui peut sembler dense
au début, mais qui devient redoutablement efficace une fois maîtrisée. Elle suit
une structure simple :
find [chemin] [conditions] [actions]
Composants principaux
- Chemin : le point de départ de la recherche. Exemple :
/
,/home
,.
(répertoire courant). - Conditions : critères de sélection (nom, taille, date, type…).
- Actions : ce qu’on veut faire avec les résultats (afficher, supprimer, déplacer…).
Exemple minimal
Pour lister tous les fichiers du répertoire courant et ses sous-dossiers :
find .
Exemples avec critères
Rechercher tous les fichiers appelés config.php
dans /var/www
:
find /var/www -name "config.php"
Rechercher sans tenir compte de la casse (-iname
) :
find /home -iname "*.jpg"
Afficher les fichiers trouvés avec leur chemin absolu :
find /etc -name "*.conf" -print
Syntaxe avec actions
Exécuter une commande sur chaque fichier trouvé (exemple : suppression) :
find /tmp -type f -name "*.tmp" -exec rm {} \;
Ici, {}
est remplacé par chaque fichier trouvé, et \;
termine la commande
-exec
.
La syntaxe de find
est modulaire : on peut enchaîner autant de critères et
d’actions que nécessaire. C’est ce qui la rend à la fois très puissante et
parfaitement adaptable à chaque situation.
Recherche par nom
L’un des usages les plus courants de find
est la recherche de fichiers ou de
répertoires selon leur nom. Cette opération peut être précise ou plus souple
grâce aux jokers (*
, ?
) et à la gestion de la casse.
Rechercher un fichier par nom exact
Pour trouver un fichier nommé erreurs.log
dans /var/log
:
find /var/log -name "erreurs.log"
Cette commande est sensible à la casse.
Rechercher un fichier sans tenir compte de la casse
Pour trouver un fichier comme Rapport.TXT
, rapport.txt
, ou RAPPORT.txt
:
find /home -iname "rapport.txt"
-iname
ignore la casse des lettres, ce qui est utile dans des systèmes avec
des noms de fichiers incohérents.
Utiliser des jokers pour filtrer
-
Tous les fichiers
.log
:Terminal window find /var/log -name "*.log" -
Tous les fichiers qui commencent par
backup
:Terminal window find /data -name "backup*" -
Tous les fichiers ayant exactement 5 caractères, suivis de
.txt
:Terminal window find . -name "?????.txt"
Rechercher plusieurs motifs avec -o
Pour trouver tous les fichiers .sh
ou .py
:
find . \( -name "*.sh" -o -name "*.py" \)
N’oubliez pas d’échapper les parenthèses avec \(
et \)
.
Exclure un motif de la recherche
Pour ignorer tous les fichiers .bak
:
find . -name "*.txt" ! -name "*.bak"
La recherche par nom avec find
est un réflexe quotidien pour retrouver un
fichier spécifique sans fouiller à la main. Grâce aux options comme -iname
,
aux jokers et aux combinaisons logiques, vous pouvez rapidement cibler ce que
vous cherchez, même dans une arborescence complexe.
Recherche par type de fichier
Avec l’option -type
, find
permet de filtrer les résultats selon la nature
du fichier : fichier régulier, répertoire, lien symbolique, etc. C’est
indispensable pour cibler une catégorie précise de contenu.
Types de fichiers les plus courants
Code | Type de fichier |
---|---|
f | fichier régulier |
d | répertoire |
l | lien symbolique (symlink) |
c | périphérique caractère |
b | périphérique bloc |
s | socket |
p | tube nommé (FIFO) |
Trouver tous les fichiers réguliers
find /etc -type f
Trouver tous les dossiers
find /home -type d
Trouver tous les liens symboliques
find /usr -type l
Rechercher un type avec un nom spécifique
Par exemple, trouver tous les répertoires nommés tmp
:
find / -type d -name "tmp"
Ou tous les fichiers .sh
:
find . -type f -name "*.sh"
Combiner avec d’autres critères
Exemple : tous les liens symboliques pointant vers un fichier .conf
:
find /etc -type l -name "*.conf"
Grâce à l’option -type
, vous pouvez affiner très rapidement vos recherches et
éviter d’avoir des résultats parasites comme des répertoires alors que vous
cherchez des fichiers, ou inversement.
Recherche par taille
find
permet de localiser des fichiers en fonction de leur taille exacte ou
taille relative (plus grands ou plus petits que…). C’est très utile pour
repérer des fichiers trop volumineux, des vides à nettoyer, ou pour
auditer l’espace disque.
Syntaxe de base
find [chemin] -size [valeur]
La valeur peut être exprimée dans différentes unités :
Suffixe | Unité |
---|---|
c | octets |
k | kilo-octets |
M | méga-octets |
G | giga-octets |
Exemples courants
Trouver les fichiers exactement de 1 Mo :
find /var/log -type f -size 1M
Fichiers de plus de 100 Mo :
find /var/log -type f -size +100M
Fichiers de moins de 10 Ko :
find . -type f -size -10k
Fichiers de taille 0 (vides) :
find /tmp -type f -size 0
Rechercher dans une plage de taille
Trouver les fichiers entre 1 Mo et 10 Mo :
find . -type f -size +1M -a -size -10M
-a
est l’opérateur et logique (implicite si non précisé).
Utiliser find
avec -size
permet d’identifier facilement les gros fichiers
oubliés, les archives mal compressées, ou encore de nettoyer
automatiquement certains fichiers trop petits ou trop anciens. C’est une étape
essentielle dans toute tâche de maintenance disque.
Recherche par date
Avec find
, il est possible de rechercher des fichiers en fonction de leur
date de dernière modification, d’accès, ou de changement de statut.
Cela permet de cibler précisément les fichiers récents, oubliés ou inactifs.
Trois types de dates
Option | Signification |
---|---|
-mtime | dernière modification du contenu |
-atime | dernier accès au fichier |
-ctime | dernier changement de métadonnées (chmod, etc.) |
Les valeurs s’expriment en nombre de jours.
Exemples avec -mtime
Fichiers modifiés il y a exactement 7 jours :
find . -type f -mtime 7
Fichiers modifiés il y a plus de 30 jours :
find /var/log -type f -mtime +30
Fichiers modifiés il y a moins de 24h :
find . -type f -mtime -1
Exemples avec -atime
(accès)
Fichiers jamais relus depuis plus de 90 jours :
find /home -type f -atime +90
Exemples avec -ctime
(statut changé)
Fichiers dont les droits ou propriétaires ont changé récemment :
find /etc -type f -ctime -2
Astuce : combiner avec une action
Supprimer tous les fichiers temporaires non modifiés depuis 7 jours :
find /tmp -type f -mtime +7 -exec rm -f {} \;
Ces options permettent de cibler précisément les fichiers à conserver ou à supprimer selon leur ancienneté. Idéal pour les politiques de rétention, la gestion de logs ou l’audit de fichiers dormants.
Recherche par permissions
find
permet également de filtrer les fichiers en fonction de leurs droits
d’accès (permissions UNIX). C’est un outil précieux pour identifier des
fichiers trop permissifs, incorrectement configurés, ou pour réaliser
des audits de sécurité.
Syntaxe de base
find [chemin] -perm [mode]
Le mode peut être exprimé en :
- notation symbolique (ex :
/u+s
,/g=w
) - notation octale (ex :
644
,755
,777
)
Exemples avec notation octale
Fichiers ayant exactement les permissions 644
:
find . -type f -perm 644
Fichiers avec au moins les permissions 777
:
find . -type f -perm -777
- Le tiret
-
signifie que tous les bits donnés doivent être présents, mais d’autres peuvent l’être aussi.
Fichiers avec exactement 777
, ni plus ni moins :
find . -type f -perm 0777
Fichiers exécutables par tous :
find /usr/bin -type f -perm -111
(Le bit 1 = exécution, sur user, group, et autres)
Recherche de fichiers SUID/SGID
Fichiers avec SUID (Set User ID) :
find / -type f -perm -4000
Fichiers avec SGID (Set Group ID) :
find / -type f -perm -2000
Ce sont souvent des fichiers sensibles, à surveiller en audit.
Utiliser -perm
avec find
permet de détecter rapidement des erreurs de
configuration, des fichiers exposés, ou simplement de valider des
droits dans des scripts de déploiement ou de vérification.
Recherche par propriétaire et groupe
Avec find
, on peut filtrer les fichiers selon l’utilisateur (-user
) ou
le groupe (-group
) qui les possède. C’est particulièrement utile pour :
- repérer les fichiers appartenant à un ancien utilisateur,
- identifier des fichiers avec de mauvaises permissions d’accès,
- faire un audit de fichiers sensibles.
Recherche par utilisateur
Fichiers appartenant à l’utilisateur alice
:
find /home -type f -user alice
Fichiers non appartenant à un utilisateur spécifique :
find /var -type f ! -user root
Recherche par groupe
Fichiers appartenant au groupe www-data
:
find /var/www -type f -group www-data
Fichiers ne faisant pas partie du groupe adm
:
find /var/log -type f ! -group adm
Combiner utilisateur et groupe
Rechercher tous les fichiers appartenant à mysql:mysql
:
find /var/lib/mysql -user mysql -group mysql
Avec une action
Changer les permissions sur tous les fichiers appartenant à user1
:
find /srv -type f -user user1 -exec chmod 640 {} \;
Grâce à ces options, on peut effectuer des recherches ciblées sur la propriété des fichiers, automatiser des corrections ou audits, et garantir que les données sont bien contrôlées par les bons utilisateurs ou services.
Exécution de commandes sur les résultats
L’une des fonctionnalités les plus puissantes de find
, c’est la possibilité
d’exécuter automatiquement une commande sur chaque fichier trouvé grâce à
l’option -exec
. Cela permet de traiter, supprimer, déplacer, analyser ou
modifier les fichiers en une seule ligne.
Syntaxe de base
find [chemin] [critères] -exec commande {} \;
{}
est remplacé par le nom de chaque fichier trouvé\;
marque la fin de la commande (\
échappe le;
pour le shell)
Exemples courants
Supprimer tous les fichiers .tmp
find /tmp -type f -name "*.tmp" -exec rm {} \;
Changer les permissions des fichiers .sh
find . -type f -name "*.sh" -exec chmod +x {} \;
Compter les lignes dans chaque fichier .log
find /var/log -type f -name "*.log" -exec wc -l {} \;
Utilisation avec -ok
pour confirmation
Pour exécuter une commande avec confirmation utilisateur :
find . -name "*.bak" -ok rm {} \;
Chaque suppression est alors validée manuellement.
Utilisation avec xargs
(pour plus d’efficacité)
Avec un grand nombre de fichiers, -exec
peut être lent car chaque appel est
distinct. On peut utiliser xargs
:
find . -type f -name "*.log" | xargs grep "erreur"
Supprimer les fichiers de plus de 100 Mo :
find /data -type f -size +100M -exec rm -f {} \;
Grâce à -exec
, find
devient un véritable moteur d’automatisation : non
seulement vous trouvez les bons fichiers, mais vous pouvez immédiatement agir
dessus, sans écrire de boucle shell ou de script complexe.
Optimisation des recherches
Dans les grandes arborescences ou pour des tâches automatisées, il est utile
d’optimiser les recherches avec find
pour les rendre plus rapides, plus
ciblées et plus précises. Voici les options principales pour affiner vos
recherches.
Limiter la profondeur avec -maxdepth
et -mindepth
-maxdepth N
: limite la descente à N niveaux de profondeur
Exemple : rechercher uniquement dans le répertoire courant (niveau 1) :
find . -maxdepth 1 -type f
-mindepth N
: ignore les N premiers niveaux
Exemple : ignorer le répertoire courant et ne chercher que dans les sous-dossiers :
find . -mindepth 2 -type f
On peut combiner les deux :
find . -mindepth 2 -maxdepth 4 -name "*.log"
Exclure un répertoire avec -prune
Pour ignorer un sous-dossier spécifique pendant la recherche :
find . -path "./node_modules" -prune -o -type f -name "*.js" -print
Important :
-prune
doit être combiné avec-o
et
Optimiser les suppressions massives
Plutôt que :
find . -name "*.bak" -exec rm {} \;
Préférez :
find . -name "*.bak" -print0 | xargs -0 rm
Cela gère les noms de fichiers avec espaces ou caractères spéciaux.
Utiliser des expressions simples en priorité
Les critères simples comme -type
, -name
ou -mtime
sont plus rapides à
évaluer. Placez-les en début de ligne pour un gain de performance.
Ces optimisations permettent de réduire les temps d’exécution, d’éviter des erreurs (fichiers sensibles dans un répertoire à ignorer) et de mieux contrôler la portée de vos recherches, surtout dans des scripts d’administration ou de sauvegarde.
Bonnes pratiques
Pour tirer le meilleur parti de la commande find
, il est essentiel d’adopter
des pratiques qui garantissent la fiabilité, la sécurité et la
performance de vos recherches, surtout en environnement de production.
Rediriger les erreurs
Pour éviter que les messages d’erreur polluent l’affichage, surtout lors de recherches sur tout le système :
find / -type f -name "*.conf" 2>/dev/null
Cela masque les erreurs liées aux permissions refusées.
Toujours tester avec -print
avant d’agir
Avant d’utiliser une commande destructive comme rm
ou chmod
, vérifiez les
fichiers ciblés :
find . -name "*.bak" -print
Puis seulement après validation :
find . -name "*.bak" -exec rm {} \;
Protéger les chemins avec guillemets
Utilisez toujours des guillemets autour des motifs :
find . -name "*.sh"
Cela évite que le shell n’expande les jokers avant find
.
Sécuriser les actions avec -ok
Pour toute commande risquée (comme supprimer ou modifier en masse), préférez
-ok
:
find . -name "*.log" -ok rm {} \;
Utiliser xargs
avec -print0
pour plus de robustesse
Pour traiter les noms de fichiers contenant des espaces ou des caractères spéciaux :
find . -type f -print0 | xargs -0 rm
Utiliser des chemins absolus dans les scripts
Évitez les chemins relatifs dans les cron jobs ou scripts automatisés :
find /var/backups -type f -mtime +30 -exec rm {} \;
Ces bonnes pratiques rendent vos recherches avec find
plus précises,
sécurisées et adaptées aux environnements critiques, en évitant les
erreurs fréquentes ou les suppressions accidentelles.
Conclusion
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.