Linux / Commande find : rechercher des fichiers avec des conditions précises
find parcourt les chemins de départ que vous choisissez et sélectionne les fichiers ou dossiers selon leur nom, leur type, leur taille ou leurs horodatages. Il examine le système de fichiers actuel et peut ensuite afficher les résultats ou leur appliquer une commande. Commencez par une recherche avec -print pour vérifier les chemins retenus avant toute action qui les modifie.
Les exemples utilisent GNU find. Le manuel officiel GNU Findutils décrit ses tests et actions ; find --help et man find permettent de vérifier la version installée sur votre système.
Construire une recherche avec un point de départ précis
La structure générale est find CHEMIN... EXPRESSION. Les chemins viennent avant les conditions. Une expression associe des tests, des opérateurs logiques et des actions ; dans les exemples de lecture, -print affiche chaque chemin sélectionné. Le parcours descend normalement dans les sous-dossiers.
Créez un nouveau dossier de pratique et quelques fichiers pour obtenir des résultats prévisibles. Exécutez les blocs suivants dans le même shell pour conserver lab :
lab=$(mktemp -d "$HOME/find-lab.XXXXXX") || exit 1
mkdir -p -- "$lab/journaux/archive" "$lab/vide"
printf 'journal\n' > "$lab/journaux/app.log"
printf 'configuration\n' > "$lab/journaux/app.conf"
printf 'ancien\n' > "$lab/journaux/archive/ancien.log"
find "$lab" -type f -name '*.log' -print
La recherche doit afficher les chemins de app.log et ancien.log. L'ordre n'est pas garanti. Le motif '*.log' est entre guillemets pour que le shell ne le remplace pas par les fichiers du dossier courant. -name compare le dernier nom, sans son chemin parent ; -iname ignore la casse dans les versions qui le prennent en charge.
Pour une recherche limitée au premier niveau du dossier journaux, placez l'option de profondeur avant les tests :
find "$lab/journaux" -maxdepth 1 -type f -name '*.log' -print
find "$lab" -type d -empty -print
Le premier appel retient seulement app.log, car le fichier d'archive se trouve plus bas. Le second retient le dossier vide vide. Le point de départ compte comme profondeur zéro ; -maxdepth 1 examine ses enfants directs. Combinez -empty avec -type d ou -type f, car ce test peut correspondre à des dossiers ou à des fichiers ordinaires vides.
Associer les conditions sans erreur de priorité
Deux tests adjacents sont liés par un « et » implicite. Ainsi, -type f -name '*.log' retient un fichier ordinaire dont le nom correspond au motif. L'opérateur -o exprime « ou », mais il a une priorité plus faible que « et ». Groupez les alternatives avec des parenthèses protégées du shell :
find "$lab" -type f \( -name '*.log' -o -name '*.conf' \) -print
Cette expression affiche les trois fichiers créés plus haut. Sans les parenthèses, une partie de l'alternative pourrait échapper au test de type ou à l'action d'affichage. Les tests et actions sont évalués de gauche à droite selon ces priorités, avec arrêt quand le résultat logique est déjà connu ; l'emplacement d'une action a donc un effet réel.
Interpréter les tailles et les âges des fichiers
| Condition GNU | Sens | À retenir |
|---|---|---|
-type f / -type d / -type l |
Fichier ordinaire, dossier ou lien symbolique. | Le suivi des liens dépend des options choisies. |
-size +100M |
Taille supérieure à 100 mébioctets. | M signifie 1 048 576 octets ; les unités sont arrondies vers le haut pour le test. |
-mmin -60 |
Modification dans les soixante dernières minutes, selon la granularité du test. | Ce n'est pas l'heure de création du fichier. |
-mtime 0 |
Moins de 24 heures depuis la modification. | Les périodes complètes de 24 heures sont arrondies vers le bas. |
-mtime 1 |
De 24 heures incluses à moins de 48 heures. | Ne signifie pas automatiquement « hier » dans le calendrier. |
-mtime +30 |
Plus de 30 périodes complètes, donc au moins 31 jours. | Les bornes diffèrent d'un simple seuil de 30 fois 24 heures. |
Le calcul des âges dans GNU find précise cet arrondi. Pour les tailles, l'arrondi par unité peut aussi surprendre : -size -1M ne sélectionne que les fichiers vides, alors que -size -1048576c sélectionne les tailles strictement inférieures à 1 048 576 octets. Le suffixe c demande un calcul en octets.
Transmettre les résultats à une commande
-exec COMMANDE {} + transmet les chemins sélectionnés comme arguments, en regroupant autant de fichiers que possible par appel. Cela évite de découper les noms sur les espaces ou retours à la ligne. Pour inspecter les fichiers du laboratoire sans les modifier :
find "$lab" -type f -name '*.log' -exec ls -l -- {} +
{} est remplacé par les chemins et + termine l'action. Le -- appartient ici à ls et sépare ses options des noms. La commande doit afficher les attributs des deux journaux du laboratoire. Une variante terminée par \; appelle la commande une fois par résultat, ce qui peut être plus lent pour beaucoup de fichiers.
Évitez de construire une chaîne de shell contenant directement les noms trouvés. Pour transmettre une liste à un outil compatible, -print0 et une entrée séparée par octets nuls constituent une autre solution. Les permissions peuvent empêcher certaines lectures : examinez les diagnostics et l'état de sortie au lieu de masquer systématiquement les erreurs.
Vérifier une sélection avant d'envisager une suppression
-delete supprime immédiatement les entrées atteintes par l'expression et ne les envoie pas dans une corbeille. Dans GNU find, cette action active automatiquement -depth, qui traite les enfants avant leur dossier. Pour que la prévisualisation utilise le même ordre de parcours, indiquez déjà -depth dans la recherche de contrôle.
L'exemple suivant est uniquement une lecture. Remplacez le point de départ par un dossier de cache dont vous connaissez le rôle, puis examinez chaque résultat et la règle de conservation avant toute modification :
find ./cache -depth -type f -mtime +30 -print
Si vous choisissez ensuite une suppression, l'action -delete doit remplacer l'action d'affichage après les mêmes conditions validées. Ne la placez jamais au début de l'expression : les tests écrits après elle n'empêcheraient pas l'action déjà exécutée. Ne combinez pas aveuglément -prune et -delete, puisque le parcours en profondeur rend l'exclusion par -prune inefficace. Le manuel GNU de l'action -delete détaille cette interaction.
Une liste vérifiée peut aussi changer entre la recherche et une action ultérieure. Avant un traitement sur des données réelles, contrôlez le point de départ, les montages traversés, les liens symboliques et la possibilité de restaurer les fichiers. Par défaut, GNU find ne suit pas les liens symboliques pendant la descente ; -L modifie ce comportement et doit être choisi explicitement en comprenant les cibles parcourues.
Choisir find ou un autre outil de recherche
Utilisez find lorsque l'état présent, les attributs ou une arborescence précise comptent. La commande locate consulte un index de noms, ce qui évite un parcours à chaque requête mais peut produire des résultats périmés. which recherche des exécutables dans PATH ; grep recherche du texte dans le contenu des fichiers. Un nom qui contient « erreur » et un fichier contenant le mot « erreur » demandent donc des recherches différentes.
Questions fréquentes
Pourquoi mon motif trouve-t-il les mauvais fichiers ?
Vérifiez les guillemets autour du motif, le point de départ et le regroupement des alternatives avec \( et \). Utilisez explicitement -print pour contrôler le résultat.
find cherche-t-il aussi dans les sous-dossiers ?
Oui, sauf si vous limitez ou excluez le parcours. Dans GNU find, -maxdepth limite la profondeur à partir du point de départ.
La référence des commandes Linux par tâche aide à choisir les autres outils de localisation et de traitement.




