grep cherche à l’intérieur des fichiers. find cherche les fichiers eux-mêmes — par nom, par date, par taille, par type, par permissions... et il peut même exécuter une commande sur chaque résultat.
C’est l’outil à dégainer quand vous vous demandez “mais où est passé ce fichier ?“ ou “quels sont les fichiers modifiés aujourd’hui ?“.
La forme de base
find où quoi
Plus précisément :
find [dossier de départ] [critères]
Si vous ne précisez pas de dossier, find cherche dans le dossier courant. Si vous ne précisez pas de critères, il liste absolument tout.
find .
Ça affiche tous les fichiers et dossiers à partir d’ici. Souvent des milliers de lignes — utile surtout combiné avec des critères.
Chercher par nom
-name — le critère le plus courant
find . -name "config.ini"
./projet/config.ini
./backup/config.ini
Trouve tous les fichiers qui s’appellent exactement config.ini, où qu’ils soient dans l’arborescence.
Les guillemets acceptent les wildcards :
find . -name "*.log" # tous les fichiers .log
find . -name "test_*" # tout ce qui commence par test_
find . -name "*config*" # tout ce qui contient "config"
-iname — sans se soucier de la casse
find . -iname "readme*"
Trouve README.md, Readme.txt, readme.rst... La casse ne compte plus.
Chercher par type
find . -type f # fichiers uniquement
find . -type d # dossiers uniquement
find . -type l # liens symboliques
En pratique, vous combinez presque toujours -type f avec autre chose pour éviter que les dossiers parasitent les résultats :
find . -type f -name "*.py"
./src/main.py
./src/utils.py
./tests/test_auth.py
Chercher par date
C’est là que find devient vraiment utile. Trois critères selon ce qui vous intéresse :
-mtime— date de modification du contenu-atime— date de dernier accès-ctime— date de changement (métadonnées, permissions...)
La valeur se donne en jours :
find . -mtime -1 # modifiés dans les dernières 24h
find . -mtime -7 # modifiés dans les 7 derniers jours
find . -mtime +30 # pas touchés depuis plus de 30 jours
find . -mtime 0 # modifiés aujourd'hui exactement
Le
-signifie “il y a moins de”, le+signifie “il y a plus de”.
Exemple concret : retrouver ce fichier que vous avez modifié ce matin.
find ~ -type f -mtime -1
Pour une précision en minutes plutôt qu’en jours, utilisez -mmin :
find . -mmin -30 # modifiés dans les 30 dernières minutes
Chercher par taille
find . -size +100M # fichiers de plus de 100 Mo
find . -size -10k # fichiers de moins de 10 Ko
find . -size 0 # fichiers vides
Les unités disponibles : c (octets), k (Ko), M (Mo), G (Go).
Cas d’usage classique : votre disque est plein, vous cherchez les gros fichiers.
find / -type f -size +500M 2>/dev/null
Le 2>/dev/null cache les erreurs de permission — sinon le terminal se remplit de “Permission denied”.
Chercher par profondeur
Par défaut, find descend dans tous les sous-dossiers sans limite. Pour contrôler ça :
find . -maxdepth 1 -name "*.txt" # seulement dans le dossier courant
find . -maxdepth 2 -name "*.txt" # courant + un niveau en dessous
find . -mindepth 2 -name "*.txt" # à partir du 2ème niveau
Combiner les critères
Les critères se cumulent — par défaut c’est un ET logique.
# Fichiers Python modifiés cette semaine
find . -type f -name "*.py" -mtime -7
# Fichiers vides dans le dossier tmp
find /tmp -type f -size 0
Pour un OU logique, utilisez -o :
find . -name "*.jpg" -o -name "*.png"
Pour exclure quelque chose, utilisez ! (ou -not) :
# Tous les .txt sauf ceux dans node_modules
find . -name "*.txt" ! -path "*/node_modules/*"
Exécuter une commande sur les résultats
C’est la fonctionnalité la plus puissante de find. Au lieu d’afficher les fichiers, il peut les traiter.
-exec — pour chaque fichier trouvé
find . -name "*.log" -exec rm {} \;
{} est remplacé par le nom du fichier, \; termine la commande. Ici on supprime tous les .log trouvés.
Autre exemple — afficher les 5 premières lignes de chaque fichier Python :
find . -name "*.py" -exec head -5 {} \;
-exec ... + — plus efficace
En remplaçant \; par +, find passe tous les fichiers d’un coup à la commande plutôt qu’un par un :
find . -name "*.py" -exec wc -l {} +
C’est équivalent à wc -l fichier1.py fichier2.py ... — beaucoup plus rapide sur de nombreux fichiers.
Supprimer avec -delete
Pour supprimer, -delete est plus simple et plus rapide que -exec rm :
find . -name "*.tmp" -delete
find . -type f -size 0 -delete # supprimer les fichiers vides
Attention : toujours tester sans
-deleted’abord pour voir ce qui sera supprimé.
Petite mise en pratique
Exercice 1 — Débutant
Trouvez tous les fichiers .conf dans /etc.
Voir la réponse
find /etc -name "*.conf"
Exercice 2 — Débutant
Listez tous les dossiers dans votre répertoire personnel (pas les fichiers).
Voir la réponse
find ~ -type d
Exercice 3 — Intermédiaire
Trouvez tous les fichiers modifiés dans les 2 derniers jours dans votre projet (./mon-projet).
Voir la réponse
find ./mon-projet -type f -mtime -2
Exercice 4 — Intermédiaire
Trouvez les fichiers de plus de 100 Mo sur votre système (en ignorant les erreurs de permission).
Voir la réponse
find / -type f -size +100M 2>/dev/null
Exercice 5 — Avancé
Supprimez tous les fichiers .tmp dans le dossier courant, sans toucher aux sous-dossiers.
Voir la réponse
find . -maxdepth 1 -name "*.tmp" -delete
-maxdepth 1 limite la recherche au dossier courant uniquement.
Cheatsheet
| Commande | Ce qu’elle fait |
|---|---|
find . -name "*.txt" |
Fichiers par nom (wildcard OK) |
find . -iname "readme*" |
Insensible à la casse |
find . -type f |
Fichiers uniquement |
find . -type d |
Dossiers uniquement |
find . -mtime -7 |
Modifiés dans les 7 derniers jours |
find . -mtime +30 |
Pas touchés depuis 30 jours |
find . -mmin -60 |
Modifiés dans la dernière heure |
find . -size +100M |
Plus de 100 Mo |
find . -size 0 |
Fichiers vides |
find . -maxdepth 2 |
Limiter la profondeur |
find . -name "*.log" -delete |
Trouver et supprimer |
find . -name "*.py" -exec wc -l {} + |
Trouver et exécuter |
find . -name "*.txt" ! -path "*/node_modules/*" |
Exclure un chemin |
Pour aller plus loin
-newer fichier— trouve les fichiers plus récents qu’un fichier de référence. Pratique dans les Makefiles.-perm— cherche par permissions (find . -perm 777pour les fichiers accessibles à tous).-user/-group— cherche par propriétaire.xargs— alternative à-exec, souvent plus flexible :find . -name "*.py" | xargs grep "TODO"(chercher un motif dans tous les fichiers Python).fd— une alternative moderne àfind, plus rapide et avec une syntaxe plus simple. À connaître si vous cherchez souvent.
La documentation complète : man find dans votre terminal.
Commentaires
Aucun commentaire pour l'instant. Soyez le premier !
Laisser un commentaire