Vous cherchez un fichier précis sur votre système Linux et vous vous perdez dans les répertoires ? La commande find vous semble compliquée avec toutes ses options ? Vous avez besoin d’exemples clairs pour trouver ce que vous voulez, sans perdre de temps ?

Cet article est un guide pratique pour vous aider. Il vous donne des exemples concrets et prêts à l’emploi pour maîtriser la commande find et rechercher efficacement n’importe quel fichier sur votre système, des cas les plus simples aux plus complexes.

La commande find : Aide-mémoire des options courantes

Pour commencer, voici un tableau qui résume les options les plus utiles de la commande find. C’est la partie à garder sous la main pour trouver rapidement ce dont vous avez besoin. Chaque option est un filtre qui permet d’affiner votre recherche.

Option Description Exemple simple
-name "motif" Trouve les fichiers dont le nom correspond exactement au motif. C’est sensible à la casse (majuscules/minuscules). find . -name "*.log"
-iname "motif" Identique à -name, mais ignore la casse. « LOG », « Log », et « log » seront trouvés. find . -iname "*.log"
-type [f/d/l] Filtre par type de fichier : f (fichier), d (répertoire/dossier), l (lien symbolique). find . -type f
-size [+ / -]N[c/k/M/G] Recherche par taille. +N (plus grand que), -N (plus petit que), N (taille exacte). find . -size +10M
-empty Trouve les fichiers et répertoires qui sont vides. find . -type f -empty
-mtime [+ / -]N Filtre par date de dernière modification (modification time), en jours. find . -mtime -7
-perm [mode] Recherche par permissions du fichier (ex: 777, 644). find . -perm 777
-user [nom] Trouve les fichiers appartenant à un utilisateur spécifique. find /home -user john
-group [nom] Trouve les fichiers appartenant à un groupe spécifique. find /var/www -group www-data
-exec [commande] {} \; Exécute une commande sur chaque fichier trouvé. Très puissant. find . -name "*.tmp" -exec rm {} \;
-delete Supprime directement les fichiers trouvés. C’est plus rapide que -exec rm. find . -name "*.bak" -delete
-maxdepth N Limite la profondeur de la recherche à N niveaux de sous-répertoires. find . -maxdepth 2 -name "config"
-prune Exclut un répertoire de la recherche. Utile pour ignorer des dossiers comme node_modules. find . -path "./tmp" -prune -o -print

Comprendre la syntaxe fondamentale de `find`

La structure de la commande find est toujours la même. Si vous comprenez cette logique, vous pouvez construire n’importe quelle recherche. La syntaxe se décompose en trois parties simples : où chercher, quoi chercher, et quelle action faire.

find [où] [quoi] [action]

Décortiquons ces trois éléments :

  • Où (le chemin) : C’est le point de départ de la recherche. find va scanner ce répertoire et tous ses sous-répertoires. On parle de recherche récursive. Les chemins les plus courants sont . (le répertoire courant), / (la racine de tout le système de fichiers), ou ~ (votre dossier personnel).
  • Quoi (les filtres/options) : C’est la description du fichier que vous cherchez. Vous pouvez utiliser les options du tableau ci-dessus, comme -name pour le nom, -size pour la taille, ou -mtime pour la date de modification. Vous pouvez combiner plusieurs filtres.
  • Action : C’est ce que find doit faire avec les résultats. Par défaut, l’action est -print, qui affiche simplement le chemin du fichier sur le terminal. D’autres actions puissantes existent, comme -delete pour supprimer ou -exec pour lancer une autre commande.

Filtrer les fichiers par critères : 20 exemples essentiels

Le meilleur moyen de comprendre find, c’est par la pratique. Voici des exemples concrets pour les cas d’usage les plus fréquents. Vous pouvez copier-coller ces lignes de commande directement dans votre terminal Unix ou Linux.

Par nom et extension (`-name`, `-iname`)

La recherche par nom est l’utilisation la plus basique. La différence entre -name et -iname est simple : -iname ignore les majuscules et les minuscules, ce qui est souvent plus pratique.

Pour trouver tous les fichiers qui se terminent par .conf dans le répertoire /etc :

find /etc -name "*.conf"

Pour trouver tous les fichiers d’images (JPG, jpg, Jpeg, etc.) dans votre dossier personnel, sans se soucier de la casse :

find ~ -iname "*.jpg"

Par type (`-type f`, `-type d`, `-type l`)

Parfois, vous ne cherchez pas un fichier mais un répertoire, ou l’inverse. L’option -type permet de spécifier le type de fichier à rechercher.

  • f pour un fichier standard (file)
  • d pour un répertoire (directory)
  • l pour un lien symbolique (link)

Pour lister uniquement les répertoires dans le dossier courant :

find . -type d

Pour trouver tous les fichiers (et non les dossiers) qui s’appellent config.xml :

find / -type f -name "config.xml"

Par taille (`-size`, `-empty`)

Vous pouvez rechercher des fichiers en fonction de leur taille. C’est très utile pour trouver des fichiers logs trop volumineux ou pour faire du nettoyage. L’unité est importante : c (octets), k (kilo-octets), M (méga-octets), G (giga-octets).

Pour trouver tous les fichiers de plus de 100 Méga-octets dans /var/log :

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

Pour trouver tous les fichiers de moins de 5 Kilo-octets :

find . -type f -size -5k

Vous pouvez aussi trouver les fichiers exactement d’une certaine taille (ici 512 octets) :

find . -type f -size 512c

Pour lister tous les fichiers et répertoires qui sont vides :

find . -empty

Par date (`-mtime`, `-ctime`, `-amin`)

Rechercher par date est essentiel pour trouver des fichiers récents ou anciens. Le système de fichiers Linux garde la trace de trois types de dates :

  • -mtime (modification time) : La date de la dernière modification du contenu du fichier. C’est la plus utilisée.
  • -ctime (change time) : La date du dernier changement de statut du fichier (permissions, propriétaire, etc.).
  • -atime (access time) : La date du dernier accès (lecture) au fichier.

L’unité est le nombre de jours. Le signe est important : -N signifie « il y a moins de N jours » et +N signifie « il y a plus de N jours ».

Pour trouver tous les fichiers modifiés au cours des dernières 24 heures (moins d’un jour) dans votre dossier personnel :

find ~ -mtime -1

Pour trouver les fichiers de configuration modifiés il y a plus de 30 jours :

find /etc -name "*.conf" -mtime +30

Vous pouvez aussi utiliser les minutes avec -mmin, -cmin, et -amin. Pour trouver les fichiers auxquels on a accédé il y a moins de 10 minutes :

find . -amin -10

Par permissions et propriétaire (`-perm`, `-user`, `-group`)

Cette option est cruciale pour les administrateurs système qui veulent vérifier la sécurité. Vous pouvez trouver des fichiers avec des permissions spécifiques ou appartenant à un utilisateur précis.

Pour trouver tous les fichiers avec des permissions dangereuses (777), qui sont lisibles, modifiables et exécutables par tout le monde :

find . -type f -perm 777

Pour trouver tous les fichiers appartenant à l’utilisateur « www-data » :

find /var/www -user www-data

Pour lister tous les répertoires appartenant au groupe « developers » :

find /home -type d -group developers

Combiner les filtres et maîtriser la logique (ET, OU, NON)

La vraie puissance de find apparaît quand vous combinez plusieurs critères. Par défaut, find utilise une logique ET : il faut que toutes les conditions soient vraies.

Pour trouver les fichiers .log (condition 1) ET qui font plus de 10M (condition 2) :

find . -name "*.log" -size +10M

Pour des recherches plus complexes, vous pouvez utiliser les opérateurs OU (-o) et NON (-not ou !). Attention, quand vous utilisez l’opérateur OU, il faut souvent utiliser des parenthèses échappées \( ... \) pour que le shell interprète correctement la commande.

Pour trouver les fichiers qui sont des .log OU des .txt :

find . \( -name "*.log" -o -name "*.txt" \)

Pour trouver tous les fichiers qui n’appartiennent PAS à l’utilisateur `root` :

find /etc -not -user root

Voici un exemple plus complexe. On cherche tous les fichiers qui NE SONT PAS des .conf (condition 1) ET qui ont été modifiés il y a moins de 7 jours (condition 2) :

find . -not -name "*.conf" -mtime -7

Exécuter des actions sur les résultats (`-exec`, `-delete`, `xargs`)

Trouver des fichiers, c’est bien. Agir dessus, c’est mieux. La commande find permet d’exécuter des actions sur les fichiers trouvés, mais cela doit être fait avec précaution.

L’option -exec permet de lancer n’importe quelle commande shell. Le symbole {} est un emplacement qui sera remplacé par le nom de chaque fichier trouvé. La commande doit se terminer par \; (exécute pour chaque fichier) ou + (exécute sur un groupe de fichiers, plus performant).

Pour trouver tous les fichiers .php et afficher leurs 10 premières lignes avec head :

find . -type f -name "*.php" -exec head -n 10 {} \;

Pour changer les permissions de tous les répertoires en 755 et de tous les fichiers en 644 :

# Pour les répertoires
find . -type d -exec chmod 755 {} +

# Pour les fichiers
find . -type f -exec chmod 644 {} +
⚠️ Règle d’or : à utiliser avec prudence !

Les options -exec et -delete sont très puissantes et peuvent causer des dommages irréversibles. Avant de supprimer ou modifier des fichiers, testez TOUJOURS votre commande find en remplaçant l’action par -print. Cela vous montrera la liste des fichiers qui seront affectés, sans rien modifier.

Pour supprimer, l’option -delete est une alternative plus simple et plus rapide à -exec rm {} \;. Elle supprime directement les fichiers trouvés.

Pour supprimer tous les fichiers temporaires .tmp :

find . -name "*.tmp" -delete

Enfin, xargs est une commande qui fonctionne très bien avec find. Elle est souvent plus flexible et performante que -exec, surtout pour gérer les noms de fichiers avec des espaces. On combine -print0 (qui sépare les noms de fichiers avec un caractère spécial) et xargs -0.

Pour archiver tous les fichiers .log dans une archive tar, en gérant correctement les espaces :

find /var/log -name "*.log" -print0 | xargs -0 tar -cvf logs.tar

Optimiser la recherche (`-maxdepth`, `-prune`)

Par défaut, find explore tous les sous-répertoires, ce qui peut être lent sur de gros systèmes de fichiers. Vous pouvez optimiser la recherche pour gagner du temps.

L’option -maxdepth permet de limiter la profondeur de la recherche. -maxdepth 1 ne cherchera que dans le répertoire courant, sans descendre dans les sous-dossiers.

Pour trouver les fichiers .txt uniquement dans le répertoire actuel et ses sous-dossiers de premier niveau :

find . -maxdepth 2 -name "*.txt"

L’option -prune est utilisée pour exclure un répertoire de la recherche. C’est parfait pour ignorer des dossiers lourds et inutiles comme node_modules ou .git.

Pour trouver tous les fichiers sauf ceux dans le répertoire ./vendor :

find . -path "./vendor" -prune -o -print

Cette commande se lit comme ceci : « cherche partout, mais si tu tombes sur le chemin ./vendor, ignore-le (-prune), OU (-o) affiche le nom du fichier trouvé (-print) ».

`find` vs `locate` vs `grep` : Quel outil choisir ?

Linux propose plusieurs outils pour la recherche, et il est facile de les confondre. Voici un tableau simple pour savoir quand utiliser chaque commande.

Outil Usage principal Avantage / Inconvénient
find Recherche de fichiers en temps réel basée sur des critères (nom, taille, date, etc.). Avantage : Extrêmement puissant et flexible. Inconvénient : Peut être lent car il scanne le disque en direct.
locate Recherche ultra-rapide de fichiers par nom. Avantage : Très rapide. Inconvénient : Utilise un index (une base de données). Si un fichier vient d’être créé, locate ne le trouvera pas avant la mise à jour de l’index (via updatedb).
grep Recherche d’un texte à l’intérieur du contenu des fichiers. Avantage : Indispensable pour trouver des lignes de code ou des configurations. Inconvénient : Ne cherche pas les fichiers eux-mêmes, mais ce qu’ils contiennent.

FAQ – Questions fréquentes sur la commande find

Comment trouver des fichiers modifiés entre deux dates ?

Vous pouvez combiner les options de date. Pour trouver des fichiers modifiés après une date de début et avant une date de fin, utilisez -newermt. Par exemple, pour les fichiers modifiés en janvier 2023 :

find . -type f -newermt "2023-01-01" ! -newermt "2023-02-01"

Pourquoi ma commande `find` est-elle si lente ?

La lenteur vient souvent du fait que vous demandez à find de scanner une très grande partie du système de fichiers (par exemple en partant de /). Pour l’accélérer, essayez de spécifier un chemin de départ plus précis ou utilisez les options -maxdepth et -prune pour limiter la recherche.

Comment gérer les noms de fichiers avec des espaces ?

C’est un piège courant. Pour une recherche simple avec -name, mettez le motif entre guillemets : find . -name "mon fichier.txt". Pour les actions avec -exec, le problème est plus complexe. La meilleure solution est d’utiliser la combinaison find ... -print0 | xargs -0 ..., qui est conçue pour gérer parfaitement ces cas.

Est-il possible de chercher dans le contenu d’un fichier avec `find` ?

Non, find ne regarde que les métadonnées des fichiers (nom, taille, date, etc.), pas leur contenu. Pour chercher du texte à l’intérieur des fichiers, vous devez combiner find avec grep en utilisant l’option -exec.

Par exemple, pour chercher le mot « database » dans tous les fichiers .xml :

find . -type f -name "*.xml" -exec grep -l "database" {} \;

Articles similaires