La commande find Linux sert à rechercher des fichiers ou des dossiers dans une arborescence selon leurs attributs — nom, type, taille, date, permissions — puis à agir directement sur les résultats. Contrairement à locate, elle parcourt le système de fichiers en temps réel : aucune base indexée à maintenir, aucun décalage entre le résultat et l’état réel du disque.
L’essentiel
Commande minimale : find . -name "*.log" cherche tous les fichiers .log à partir du dossier courant.
Prérequis : aucun. find fait partie des utilitaires GNU findutils, présents par défaut sur la quasi-totalité des distributions de bureau et de serveur.
Portée : universelle sur la syntaxe de base ; les différences avec BSD et macOS sont signalées plus bas.
Point de vigilance : find évalue la ligne de commande de gauche à droite — un filtre placé après une action ne filtre plus rien.
Sources : documentation officielle GNU findutils 4.11.0 et page de manuel Linux, POSIX Issue 8 / IEEE Std 1003.1-2024, consultés le 2 août 2026.
À quoi sert la commande find Linux
find répond à une question précise : quels fichiers, dans cette arborescence, correspondent à tel critère ?
Elle se distingue de grep, qui cherche un motif dans le contenu des fichiers, et de locate, qui interroge une base de noms de fichiers mise à jour périodiquement par le système plutôt que de parcourir le disque à chaque appel. locate est plus rapide, mais peut ignorer un fichier créé après la dernière mise à jour de sa base ; find est plus lent sur de grosses arborescences, mais toujours exact.
Syntaxe de find Linux

La syntaxe de find Linux tient en trois blocs, toujours dans le même ordre :
find [chemin] [filtres] [action]
| Bloc | Rôle |
|---|---|
| Chemin | Point de départ. Si omis, GNU find utilise le dossier courant (.). BSD et macOS exigent un chemin explicite. |
| Filtres | Critères de sélection (-name, -type, -size…). Sans filtre, find renvoie tout. |
| Action | Ce qu’il faut faire des résultats (-print, -delete, -exec…). Sans action explicite, -print est implicite. |
Ce n’est pas un détail cosmétique : find évalue les arguments de gauche à droite selon les règles de précédence, jusqu’à ce que le résultat de l’expression soit connu. Une commande comme find /tmp -delete -name '*.tmp' supprime donc tout le contenu de /tmp, parce que -delete s’exécute avant que -name n’ait eu l’occasion de filtrer quoi que ce soit.
Rechercher par nom avec find Linux
Avec find Linux, -name compare le motif au nom du fichier, sensible à la casse. -iname fait la même chose en l’ignorant.
# Fichiers .log, quelle que soit la casse de l'extension
find . -iname "*.log"
# Fichier exact, dans /etc
find /etc -name "hosts"
Le motif doit toujours être entre guillemets. Sans eux, c’est le shell qui interprète l’astérisque avant que find ne le reçoive, ce qui produit des résultats imprévisibles selon les fichiers déjà présents dans le dossier courant.
-name compare le motif à la seule dernière composante du chemin. find . -name "conf" trouve donc bien ./etc/conf, c’est le fonctionnement normal. En revanche, un motif qui contient une barre oblique ne correspond jamais à rien : -name "etc/conf" ne renvoie aucun résultat. Pour raisonner sur le chemin entier, il faut -path "*/etc/conf".
Autre point à connaître : -name n’est pas un moteur d’expressions régulières. Pour une vraie regex, find propose -regex, qui compare l’intégralité du chemin et non le seul nom du fichier. Attention au dialecte : GNU find utilise par défaut les expressions régulières d’Emacs, pas les ERE auxquelles on s’attend.
C’est une cause d’échec fréquente ; -regextype posix-extended rétablit la syntaxe habituelle.
Rechercher par type, taille et date avec find Linux
Type
find /etc -type d -name "*.d" # uniquement des dossiers
find . -type f -name "*.sh" # uniquement des fichiers réguliers
Dans find Linux, -type accepte f (fichier régulier), d (dossier), l (lien symbolique), ainsi que b, c, p et s pour les types de fichiers spéciaux. GNU find permet de combiner plusieurs types dans une liste séparée par des virgules, une extension propre à GNU : -type f,l.
Une subtilité coûte régulièrement des heures de débogage : -type l teste le lien symbolique lui-même, pas sa cible. Si vous ajoutez l’option -L en tête de commande, find résout les liens avant de tester, et find -L . -type l ne remonte alors plus que les liens cassés — ceux dont la cible n’existe pas. C’est la manière la plus courte de faire l’inventaire des liens morts d’une arborescence.
Taille
find /var/log -type f -size +100M # fichiers de plus de 100 Mio (M = 1024 Ko)
find . -type f -size -1000c # fichiers de moins de 1000 octets
-size arrondit systématiquement à l’unité supérieure. C’est un piège documenté dans le manuel GNU lui-même : -size -1M ne matche que les fichiers vides, jamais les petits fichiers, parce qu’un fichier de 1 octet est déjà arrondi à 1 Mo. Pour raisonner en taille réelle, passez par le suffixe c (octets).
Les suffixes disponibles sont b (blocs de 512 octets, par défaut), c (octets), w (mots de 2 octets), k (kibioctets), M (mébioctets) et G (gibioctets) — des puissances de 1024, pas des méga/gigaoctets décimaux.
Date
find /tmp -type f -mtime +30 # modifies il y a au moins 31 tranches de 24 h
find . -type f -mmin -60 # modifiés il y a moins de 60 minutes
Trois horodatages distincts, souvent confondus : -mtime (date de modification du contenu), -atime (dernier accès) et -ctime (dernier changement de statut de l’inode — permissions, propriétaire, renommage — pas la date de création).
Un fichier copié peut apparaître comme ancien avec -mtime si cp a préservé la date d’origine. -ctime reflète alors mieux la réalité, puisqu’il se met à jour à chaque copie.
-mtime, -atime et -ctime raisonnent en tranches de 24 heures décomptées depuis le lancement de la commande, pas depuis minuit. La partie fractionnaire de chaque tranche est tronquée.
Ainsi, pour matcher -atime +1, un fichier doit avoir été accédé il y a au moins deux jours pleins, pas simplement « plus de 24 heures ».
Par extension, -mtime +7 cible les fichiers modifiés il y a au moins huit tranches de 24 heures, pas « avant la semaine calendaire ». Pour aligner le calcul sur le début de la journée courante plutôt que sur l’heure de lancement, ajoutez l’option GNU -daystart avant le test de date.
Pour des durées courtes, -mmin, -amin et -cmin fonctionnent en minutes.
Deux tests complémentaires évitent souvent un calcul de dates : -newer fichier sélectionne tout ce qui est plus récent qu’un fichier témoin — posez un fichier repère avant une opération, et vous retrouvez ensuite tout ce qui a changé depuis. -empty cible les fichiers ou dossiers vides, plus lisible et plus fiable que -size 0.
Rechercher par propriétaire et permissions avec find Linux
find /home -user alice # fichiers appartenant à alice
find /tmp -perm 644 # permissions exactement 644
find . -perm -644 # au moins lecture/écriture propriétaire + lecture groupe/autres
find . -perm /222 # au moins un bit d'écriture, peu importe pour qui
Avec find Linux, -perm mode (sans préfixe) exige une correspondance exacte. -perm -mode teste que tous les bits indiqués sont présents, sans exclure les autres — c’est la forme la plus utile en pratique, y compris avec des modes symboliques (-perm -g+w). -perm /mode teste qu’au moins un des bits est présent.
-user et -uid acceptent tous les deux un identifiant numérique : -user 1000 fonctionne aussi bien que -user alice.
La vraie différence est que -uid accepte les comparaisons +n/-n (-uid +1000 pour « UID supérieur à 1000 »), là où -user ne teste qu’une correspondance exacte. C’est notamment utile pour retrouver les fichiers d’un propriétaire disparu du système, lorsque seul l’UID numérique subsiste.
Cette section est directement liée aux permissions Unix posées par chmod : find sert souvent à localiser ce que chmod doit ensuite corriger.
Combiner les critères avec find Linux
Avec find Linux, deux tests l’un à la suite de l’autre sont liés par un ET implicite, qui a une priorité plus forte que le OU :
# ET implicite : fichiers .log ET de plus de 10 Mo
find /var/log -type f -name "*.log" -size +10M
# OU explicite : parenthèses obligatoires
find /var/log -type f ( -name "*.log" -o -name "*.txt" )
Sans parenthèses, une commande comme find . -name "*.log" -o -name "*.txt" -mtime +7 ne fait pas ce qu’on croit : le ET implicite associe -mtime +7 uniquement au second -name, jamais au premier. Les parenthèses doivent être échappées (( )) ou mises entre guillemets, car le shell les interprète sinon lui-même.
Pour exclure un motif, ! (opérateur POSIX) ou son équivalent -not (extension GNU, non conforme POSIX mais largement supportée) fonctionnent, mais avec deux limites que l’on découvre souvent trop tard.
D’abord, la négation filtre entrée par entrée : ! -name "node_modules" masque bien le dossier lui-même, mais son contenu continue de s’afficher, puisque chaque fichier qu’il contient porte un autre nom. Il faudrait ! -path "*/node_modules/*" pour masquer le contenu.
Ensuite, dans les deux cas, find descend quand même dans le dossier et en paie le coût de parcours. Pour réellement ignorer un dossier entier — et gagner le temps de parcours associé — c’est -prune qu’il faut utiliser :
# Exclure node_modules sans y descendre
find . -name "node_modules" -prune -o -type f -name "*.js" -print
Le -print final n’est pas optionnel dans cette construction : sans lui, l’action -print implicite s’appliquerait aussi à la branche -prune, et les dossiers exclus s’afficheraient malgré tout. Autre point de vigilance documenté dans le manuel GNU : -prune n’a aucun effet si l’option -depth est active, et -delete active -depth automatiquement — les deux ne se combinent donc pas utilement.
Agir sur les résultats
Dans find Linux, -print (par défaut) et -print0 sont sans risque. -delete et -exec modifient le système de fichiers.
# SÛR : visualiser d'abord
find /tmp -name "*.tmp" -print
# Une fois la liste vérifiée
find /tmp -name "*.tmp" -delete
Attention — -delete supprime directement, sans confirmation. Ne l’ajoutez jamais en tête de commande : find évalue la ligne de gauche à droite, donc find /chemin -delete -name motif supprime tout ce qui se trouve sous /chemin avant même d’appliquer le filtre. Testez toujours avec -print en premier.
Pour exécuter une commande sur chaque résultat, -exec propose deux syntaxes aux performances très différentes :
# Un appel à chmod par fichier : lent sur un grand nombre de fichiers
find . -type f -name "*.sh" -exec chmod +x {} ;
# Un seul appel à chmod avec tous les fichiers en argument : nettement plus rapide
find . -type f -name "*.sh" -exec chmod +x {} +
Avec {} +, find regroupe les fichiers trouvés dans un nombre réduit d’invocations de la commande, à la manière de xargs.
La contrepartie ne concerne que cette forme groupée : {} doit alors être le dernier argument, immédiatement suivi de + — une construction comme -exec cp {} /destination + échoue pour cette raison, cp ayant besoin de sa destination après la liste de fichiers.
Avec ;, en revanche, {} peut apparaître n’importe où dans la commande : -exec cp {} /destination ; est parfaitement valide, simplement plus lent qu’un appel groupé sur un grand nombre de fichiers.
Il existe une façon de garder la vitesse du mode groupé quand la commande a besoin d’un argument après la liste de fichiers, et la norme POSIX la donne elle-même en exemple : déléguer à un shell intermédiaire qui replace les arguments dans le bon ordre.
# Deplacer en lot vers un dossier de destination, malgre la contrainte du mode +
find . -name "*.old" -exec sh -c 'mv "$@" /destination/' sh {} +
Le sh qui suit sh -c '...' n’est pas une faute de frappe : il occupe la place de $0, ce qui permet à "$@" de démarrer réellement au premier fichier.
Autre variante utile, -execdir fonctionne comme -exec mais lance la commande depuis le dossier contenant le fichier, ce qui la rend nettement moins vulnérable aux noms de fichiers hostiles — à une condition que le manuel pose explicitement : votre variable PATH ne doit pas contenir ., sans quoi la protection tombe.
Et si vous voulez confirmer chaque exécution une par une, -ok remplace -exec en demandant une validation avant chaque appel.
Pour chaîner avec un outil externe quand le nom de fichier peut contenir des espaces ou des caractères spéciaux, le pipeline à base de séparateur nul reste la référence :
find . -name "*.pdf" -print0 | xargs -0r mv -t ~/backup/
Un nom de fichier Unix peut contenir n’importe quel octet à deux exceptions près : la barre oblique / et le caractère nul