Aller au contenu

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 :

Terminal window
find /var/log -type f -name "*.log" -size +100M

Ou encore, pour supprimer tous les fichiers temporaires de plus de 7 jours :

Terminal window
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 :

Terminal window
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 :

Terminal window
find .

Exemples avec critères

Rechercher tous les fichiers appelés config.php dans /var/www :

Terminal window
find /var/www -name "config.php"

Rechercher sans tenir compte de la casse (-iname) :

Terminal window
find /home -iname "*.jpg"

Afficher les fichiers trouvés avec leur chemin absolu :

Terminal window
find /etc -name "*.conf" -print

Syntaxe avec actions

Exécuter une commande sur chaque fichier trouvé (exemple : suppression) :

Terminal window
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 :

Terminal window
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 :

Terminal window
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 :

Terminal window
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 :

Terminal window
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

CodeType de fichier
ffichier régulier
drépertoire
llien symbolique (symlink)
cpériphérique caractère
bpériphérique bloc
ssocket
ptube nommé (FIFO)

Trouver tous les fichiers réguliers

Terminal window
find /etc -type f

Trouver tous les dossiers

Terminal window
find /home -type d

Trouver tous les liens symboliques

Terminal window
find /usr -type l

Rechercher un type avec un nom spécifique

Par exemple, trouver tous les répertoires nommés tmp :

Terminal window
find / -type d -name "tmp"

Ou tous les fichiers .sh :

Terminal window
find . -type f -name "*.sh"

Combiner avec d’autres critères

Exemple : tous les liens symboliques pointant vers un fichier .conf :

Terminal window
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

Terminal window
find [chemin] -size [valeur]

La valeur peut être exprimée dans différentes unités :

SuffixeUnité
coctets
kkilo-octets
Mméga-octets
Ggiga-octets

Exemples courants

Trouver les fichiers exactement de 1 Mo :

Terminal window
find /var/log -type f -size 1M

Fichiers de plus de 100 Mo :

Terminal window
find /var/log -type f -size +100M

Fichiers de moins de 10 Ko :

Terminal window
find . -type f -size -10k

Fichiers de taille 0 (vides) :

Terminal window
find /tmp -type f -size 0

Rechercher dans une plage de taille

Trouver les fichiers entre 1 Mo et 10 Mo :

Terminal window
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

OptionSignification
-mtimedernière modification du contenu
-atimedernier accès au fichier
-ctimedernier 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 :

Terminal window
find . -type f -mtime 7

Fichiers modifiés il y a plus de 30 jours :

Terminal window
find /var/log -type f -mtime +30

Fichiers modifiés il y a moins de 24h :

Terminal window
find . -type f -mtime -1

Exemples avec -atime (accès)

Fichiers jamais relus depuis plus de 90 jours :

Terminal window
find /home -type f -atime +90

Exemples avec -ctime (statut changé)

Fichiers dont les droits ou propriétaires ont changé récemment :

Terminal window
find /etc -type f -ctime -2

Astuce : combiner avec une action

Supprimer tous les fichiers temporaires non modifiés depuis 7 jours :

Terminal window
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

Terminal window
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 :

Terminal window
find . -type f -perm 644

Fichiers avec au moins les permissions 777 :

Terminal window
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 :

Terminal window
find . -type f -perm 0777

Fichiers exécutables par tous :

Terminal window
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) :

Terminal window
find / -type f -perm -4000

Fichiers avec SGID (Set Group ID) :

Terminal window
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 :

Terminal window
find /home -type f -user alice

Fichiers non appartenant à un utilisateur spécifique :

Terminal window
find /var -type f ! -user root

Recherche par groupe

Fichiers appartenant au groupe www-data :

Terminal window
find /var/www -type f -group www-data

Fichiers ne faisant pas partie du groupe adm :

Terminal window
find /var/log -type f ! -group adm

Combiner utilisateur et groupe

Rechercher tous les fichiers appartenant à mysql:mysql :

Terminal window
find /var/lib/mysql -user mysql -group mysql

Avec une action

Changer les permissions sur tous les fichiers appartenant à user1 :

Terminal window
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

Terminal window
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

Terminal window
find /tmp -type f -name "*.tmp" -exec rm {} \;

Changer les permissions des fichiers .sh

Terminal window
find . -type f -name "*.sh" -exec chmod +x {} \;

Compter les lignes dans chaque fichier .log

Terminal window
find /var/log -type f -name "*.log" -exec wc -l {} \;

Utilisation avec -ok pour confirmation

Pour exécuter une commande avec confirmation utilisateur :

Terminal window
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 :

Terminal window
find . -type f -name "*.log" | xargs grep "erreur"

Supprimer les fichiers de plus de 100 Mo :

Terminal window
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) :

Terminal window
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 :

Terminal window
find . -mindepth 2 -type f

On peut combiner les deux :

Terminal window
find . -mindepth 2 -maxdepth 4 -name "*.log"

Exclure un répertoire avec -prune

Pour ignorer un sous-dossier spécifique pendant la recherche :

Terminal window
find . -path "./node_modules" -prune -o -type f -name "*.js" -print

Important : -prune doit être combiné avec -o et -print.

Optimiser les suppressions massives

Plutôt que :

Terminal window
find . -name "*.bak" -exec rm {} \;

Préférez :

Terminal window
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 :

Terminal window
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 :

Terminal window
find . -name "*.bak" -print

Puis seulement après validation :

Terminal window
find . -name "*.bak" -exec rm {} \;

Protéger les chemins avec guillemets

Utilisez toujours des guillemets autour des motifs :

Terminal window
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 :

Terminal window
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 :

Terminal window
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 :

Terminal window
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.