Tutoriel

La commande find sous Linux : rechercher des fichiers par nom, taille et date — exemples

Mis à jour: · Skillaria.Top

La commande find parcourt l'arborescence et sélectionne les fichiers selon des critères : find /path -name '*.log' cherche par nom, -type f ne retient que les fichiers, -size +100M les fichiers de plus de 100 Mo, -mtime -7 ceux modifiés depuis une semaine. Les critères se combinent, et l'on peut appliquer une action au résultat avec -exec, -delete ou transmettre la liste à xargs.

La commande find parcourt une arborescence de répertoires et trouve les fichiers selon des critères : nom, type, taille, date de modification, propriétaire et droits. Le schéma général est find [où chercher] [critères] [action]. Voici des exemples find linux pour les tâches courantes : retrouver un fichier de configuration, nettoyer d'anciens logs, repérer ce qui occupe l'espace disque.

Syntaxe de la commande find

find /var/log -type f -name '*.log' -mtime +30 -print

Décomposons :

  • /var/log — point de départ. On peut indiquer plusieurs répertoires à la suite, ou . (le répertoire courant). Sans chemin, GNU find cherche dans le répertoire courant.
  • -type f -name '*.log' -mtime +30 — critères (dans la documentation, on parle de tests). Par défaut, ils sont reliés par un « ET » logique.
  • -print — action : afficher le chemin. Elle est ajoutée automatiquement si aucune autre action n'est indiquée.

find parcourt récursivement tous les sous-répertoires. Si vous le lancez en tant qu'utilisateur ordinaire sur des chemins système, la sortie se remplit de lignes Permission denied. Pour les supprimer, redirigez le flux d'erreurs :

find / -name 'nginx.conf' 2>/dev/null

Recherche par nom : -name et -iname

Le critère -name compare uniquement le nom du fichier (sans le chemin) avec un motif. Le motif accepte * (n'importe quelle suite de caractères), ? (un caractère) et [abc] (l'un des caractères indiqués).

# nom exact
find /etc -name 'hosts'

# tous les fichiers .conf
find /etc -name '*.conf'

# sans tenir compte de la casse : README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'

# report_1.csv ... report_9.csv
find . -name 'report_?.csv'

Mettez toujours le motif entre guillemets. Sans eux, le shell développe lui-même *.conf d'après les fichiers du répertoire courant, et find reçoit une liste de noms au lieu d'un motif : le résultat est inattendu, ou la commande échoue avec l'erreur paths must precede expression.

Recherche par chemin : -path et -regex

Si le répertoire compte autant que le nom, utilisez -path — il compare le motif à tout le chemin :

# fichiers .js uniquement dans les répertoires src
find . -path '*/src/*' -name '*.js'

Pour des motifs complexes, il existe -regex (expression régulière également appliquée au chemin complet) et -iregex sans tenir compte de la casse :

find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'

Exclure un répertoire

Pour que find n'entre pas dans node_modules ou .git, on utilise -prune :

find . -path ./node_modules -prune -o -name '*.js' -print

Cela se lit ainsi : « si le chemin est ./node_modules, ne pas y descendre, sinon (-o) afficher les fichiers *.js ». Le -print final est indispensable, sinon le répertoire exclu apparaîtra aussi dans le résultat. Plus simple mais plus lent : -not -path '*/node_modules/*' — find parcourt quand même le répertoire et filtre seulement le résultat.

Recherche par type : -type

ValeurCe qui est recherché
-type ffichiers ordinaires
-type drépertoires
-type lliens symboliques
-type ssockets
-type ptubes nommés (FIFO)
# uniquement les répertoires nommés logs
find / -type d -name 'logs' 2>/dev/null

# fichiers et répertoires vides
find . -type f -empty
find . -type d -empty

# liens symboliques cassés
find . -xtype l

Recherche par taille : -size

Le critère -size accepte un nombre suivi d'un suffixe : c — octets, k — kilo-octets, M — méga-octets, G — giga-octets. Le signe + signifie « plus grand », - « plus petit », sans signe « exactement ».

# fichiers de plus de 100 Mo dans tout le système
find / -type f -size +100M 2>/dev/null

# de 10 à 50 Mo
find . -type f -size +10M -size -50M

# moins de 1 Ko
find . -type f -size -1k

Attention à un détail : la taille est arrondie à l'unité supérieure. Ainsi, -size -1M ne trouve que les fichiers vides — tout fichier non vide occupe « au moins 1 mégaoctet » après arrondi. Pour des bornes précises, utilisez des unités plus petites : -size -1024k.

Ce qui occupe l'espace disque

La combinaison de find avec ls et sort affiche les fichiers les plus volumineux :

find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm  1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root   root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root   adm   96M Oct 14 09:15 /var/log/nginx/access.log

Pour évaluer des répertoires entiers, du -sh est plus pratique ; find est utile lorsqu'un seul fichier énorme, quelque part en profondeur, a rempli le disque.

Recherche par date : -mtime, -mmin, -newer

Chaque fichier possède trois horodatages, et find sait filtrer selon chacun d'eux :

CritèreHorodatageUnité
-mtime / -mminmodification du contenujours / minutes
-atime / -amindernière lecturejours / minutes
-ctime / -cminmodification des métadonnées (droits, propriétaire, nom)jours / minutes

Les signes fonctionnent comme pour la taille : -mtime -7 — modifié il y a moins de 7 jours, -mtime +30 — il y a plus de 30 jours.

# modifiés au cours de la dernière semaine
find ~/projects -type f -mtime -7

# logs de plus de 30 jours
find /var/log -type f -name '*.log' -mtime +30

# modifiés au cours des 15 dernières minutes
find /etc -type f -mmin -15

Les jours sont comptés en périodes entières de 24 heures, la partie fractionnaire est ignorée. Ainsi, -mtime +1 trouve les fichiers de plus de 48 heures, et non de 24 — piège fréquent. Pour être précis, passez aux minutes : -mmin +1440.

Fichiers plus récents qu'un autre fichier ou qu'une date

# modifiés après la dernière modification de deploy.lock
find . -type f -newer deploy.lock

# modifiés après une date donnée (GNU find)
find . -type f -newermt '2026-10-01'

# dans un intervalle de dates
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'

Recherche par propriétaire et droits

# fichiers de l'utilisateur alice
find /home -user alice

# fichiers dont le propriétaire n'existe plus (après la suppression d'un utilisateur)
find / -nouser 2>/dev/null

# fichiers aux droits exactement 777
find /var/www -type f -perm 777

# fichiers accessibles en écriture à tous
find /var/www -perm -o=w

# fichiers avec le bit SUID — utile pour un audit de sécurité
find / -perm -4000 -type f 2>/dev/null

L'option -perm a trois formes : sans signe — les droits correspondent exactement ; avec - — au moins tous les bits indiqués sont positionnés ; avec / — au moins un des bits indiqués est positionné.

Logique des critères : ET, OU, NON

Les critères sont reliés par « ET » par défaut. Pour un « OU », on utilise -o, pour la négation ! ou -not. Le regroupement se fait avec des parenthèses, qu'il faut échapper pour le shell :

# images jpg ou png
find . -type f \( -name '*.jpg' -o -name '*.png' \)

# tout sauf les fichiers .tmp
find . -type f ! -name '*.tmp'

Sans parenthèses, -type f ne s'appliquerait qu'au premier critère de la paire « OU », et des répertoires nommés *.png figureraient dans le résultat. Les espaces autour de \( et \) sont obligatoires.

Profondeur de recherche : -maxdepth et -mindepth

# uniquement dans le répertoire courant, sans les sous-répertoires
find . -maxdepth 1 -type f -name '*.sh'

# à partir du deuxième niveau d'imbrication
find . -mindepth 2 -name '*.md'

# ne pas franchir les limites des systèmes de fichiers
find / -xdev -type f -size +1G

Placez -maxdepth juste après le chemin, avant les autres critères, sinon GNU find affiche un avertissement. L'option -xdev est utile lors d'une recherche depuis / : find n'entre alors ni dans /proc, ni dans les disques réseau ou montés.

Actions sur les résultats : -exec, -delete, xargs

-exec : exécuter une commande pour chaque fichier

À la place de {}, find insère le chemin du fichier. La commande se termine par \; ou + :

# une exécution par fichier
find . -name '*.sh' -exec chmod +x {} \;

# tous les fichiers en une seule liste — plus rapide
find . -name '*.log' -exec gzip {} +

# avec confirmation pour chaque fichier
find . -name '*.bak' -ok rm {} \;

La variante avec + regroupe les chemins par lots et lance la commande bien plus rarement, donc sur des milliers de fichiers elle est nettement plus rapide. La variante avec \; s'impose lorsque la commande n'accepte qu'un seul fichier, ou quand {} n'est pas en fin de ligne.

-delete : supprimer les résultats

# d'abord voir ce qui serait supprimé
find /tmp/build -type f -name '*.o' -mtime +7

# puis supprimer
find /tmp/build -type f -name '*.o' -mtime +7 -delete

Lancez toujours la commande sans -delete et vérifiez la liste. Placez -delete en dernier : find évalue l'expression de gauche à droite, et find . -delete -name '*.o' supprimera absolument tout dans le répertoire avant de vérifier le nom.

find et xargs

La combinaison classique consiste à transmettre la liste des fichiers à un autre programme via xargs. Pour ne pas se tromper avec des noms contenant des espaces, utilisez le séparateur octet nul :

find . -type f -name '*.txt' -print0 | xargs -0 wc -l

L'option -P de xargs lance le traitement en parallèle :

find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng

find et grep : rechercher du texte dans les fichiers

find cherche des fichiers, pas leur contenu. Pour trouver une ligne à l'intérieur des fichiers sélectionnés, transmettez-les à grep :

# où apparaît listen 8080 dans les fichiers de configuration
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4:    listen 8080;

L'option -H affiche le nom du fichier, -n le numéro de ligne, et grep -l n'affiche que les noms des fichiers contenant une correspondance. Si le filtre porte seulement sur l'extension, grep suffit : grep -rn --include='*.conf' 'listen 8080' /etc/nginx.

Format de sortie personnalisé : -printf

GNU find sait afficher bien plus que le chemin. Par exemple, la taille, la date et le nom :

find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n

Ici %s est la taille en octets, %T... la date de modification par éléments, %p le chemin. C'est pratique dans les scripts : inutile d'analyser la sortie de ls.

Aide-mémoire : les exemples find linux du quotidien

TâcheCommande
Trouver un fichier par son nomfind / -name 'file.txt' 2>/dev/null
Sans tenir compte de la cassefind . -iname '*.jpg'
Uniquement les répertoiresfind . -type d -name 'cache'
Fichiers de plus de 1 Gofind / -xdev -type f -size +1G
Modifiés dans la journéefind . -type f -mtime -1
Modifiés dans l'heurefind . -type f -mmin -60
Supprimer les logs de plus de 30 joursfind /var/log/app -name '*.log' -mtime +30 -delete
Répertoires videsfind . -type d -empty
Changer les droits de tous les répertoiresfind . -type d -exec chmod 755 {} +
Chaîne à l'intérieur des fichiersfind . -name '*.py' -exec grep -l 'TODO' {} +
Compter les fichiersfind . -type f | wc -l

Erreurs typiques

  • Motif sans guillemets. find . -name *.log casse dès qu'il existe un seul fichier .log dans le répertoire courant. Écrivez '*.log'.
  • Avalanche de Permission denied. Ajoutez 2>/dev/null, ou lancez avec sudo si vous avez vraiment besoin de tout le disque.
  • -delete mal placé. Il doit toujours être en dernier, et précédé d'un essai à blanc sans suppression.
  • Noms avec espaces dans un pipeline. find ... | xargs rm coupera « Mon fichier.txt » en deux arguments. Utilisez -print0 avec xargs -0, ou -exec.
  • Attendre des jours exacts avec -mtime. Pour des intervalles précis, prenez -mmin ou -newermt.

Conclusion

find est un outil universel de recherche dans le système de fichiers : un chemin, des critères de nom, de type, de taille, de date et de droits, puis une action. Maîtrisez cinq éléments — -name, -type, -size, -mtime et -exec ... + — et la plupart des tâches tiennent sur une seule ligne. Reprenez ces exemples find linux dans votre terminal, et la liaison de find avec grep, sed et awk est travaillée en pratique dans la leçon du cours Linux consacrée au traitement de texte dans le terminal.

Questions fréquentes

En quoi find se distingue-t-il de locate ?

locate cherche dans une base de noms construite à l'avance : il répond instantanément, mais ne voit pas les fichiers créés après la dernière mise à jour de la base par updatedb. find parcourt le disque en temps réel et sait filtrer par taille, date et droits.

Comment trouver un fichier par son contenu et non par son nom ?

find ne lit pas le contenu. Utilisez grep -rn 'texte' /chemin ou la combinaison find . -name '*.conf' -exec grep -l 'texte' {} +.

Pourquoi find est-il lent lorsqu'on le lance depuis la racine ?

Il parcourt tous les répertoires, y compris /proc, /sys et les disques montés. Limitez la recherche à un répertoire précis, ajoutez -xdev et -maxdepth, ou excluez le superflu avec -prune.

Peut-on trier les résultats de find par date ?

Oui : find . -type f -printf '%T@ %p\n' | sort -n affiche les fichiers du plus ancien au plus récent, où %T@ est l'heure de modification en secondes depuis l'époque Unix.

Comment trouver et supprimer les répertoires vides ?

La commande find . -type d -empty -delete supprime tous les répertoires vides, y compris ceux devenus vides après la suppression de leurs sous-répertoires. Lancez-la d'abord sans -delete pour vérifier la liste.

Apprenez ce sujet en vidéo

Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».

Voir le cours