Appearance
La recherche de fichiers sous Linux
La recherche de fichiers est une tâche courante et essentielle dans l'administration système. Linux offre plusieurs outils puissants pour localiser des fichiers et des programmes selon différents critères.
Vue d'ensemble des commandes de recherche
Linux propose plusieurs commandes pour rechercher des fichiers :
find: L'outil le plus puissant pour rechercher des fichiers selon de multiples critèreswhereis: Localise les binaires, sources et pages de manuel d'une commandewhich: Trouve l'emplacement d'un exécutable dans le PATHlocate: Recherche rapide basée sur une base de données indexée
La commande find
Syntaxe de base
bash
find [répertoire] [critères] [actions]find /recherche à partir de la racinefind .recherche à partir du répertoire courantfind ..recherche à partir du répertoire parentfind ~ /home/skabako/recherche à partir du répertoire personnelfind ~ dossier1/ dossier2/recherche dans plusieurs répertoires
Recherche par nom
Recherche exacte
bash
# Rechercher un fichier avec un nom exact
find /home -name "rapport.txt"
# La recherche est sensible à la casse
find /var -name "Log*"Recherche avec Caractères génériques
*: remplace zéro ou plusieurs caractères?: remplace un seul caractère[abc]: remplace un caractère parmi ceux listés[a-z]: remplace un caractère dans la plage spécifiée
bash
# Rechercher tous les fichiers .txt
find /home -name "*.txt"
# Rechercher tous les fichiers commençant par "config"
find /etc -name "config*"
# Rechercher tous les fichiers avec un nom de 5 lettres et extension .log
find /var/log -name "?????.log"
# Rechercher tous les fichiers commençant par 'a', 'b' ou 'c'
find /home -name "[abc]*"
# Rechercher tous les fichiers commençant par une lettre entre 'a' et 'm'
find /home -name "[a-m]*"
# ⚠️ Attention, dans les crochets, les métacaractères perdent leur signification spéciale. Par exemple, pour chercher un fichier nommé "Test" ou "test" :
# Le ? est pris littéralement et non pas comme un métacaractère.
find /home -name "[T?]est.log" # Trouve Test.log, ?est.logRecherche insensible à la casse avec -iname
bash
# Rechercher tous les fichiers .pdf, insensible à la casse (PDF, Pdf, PDF, etc.)
find /home -iname "*.pdf"Recherche par type
bash
# Rechercher uniquement les fichiers réguliers
find /home -type f -name "*.log"
# Rechercher uniquement les répertoires
find /var -type d -name "*temp*"
# Rechercher les liens symboliques
find /usr -type l -name "*lib*"Les types principaux :
f: fichier régulierd: répertoirel: lien symbolique
Recherche par taille
bash
# Fichiers plus grands que 100MB
find /home -size +100M
# Fichiers plus petits que 1KB
find /tmp -size -1k
# Fichiers de exactement 50MB
find /var -size 50M
# Fichiers entre 20MB et 40MB
find ~/Téléchargements -size +20M -size -40MUnités de taille :
c: octets (bytes)k: kilooctets (1024 bytes)M: mégaoctets (1024k)G: gigaoctets (1024M)
Si aucune unité n'est spécifiée, la taille est en blocs de 512 bytes.
bash
find /tmp -size +100 # Trouve les fichiers de plus de 51200 bytes (100 * 512) soit 50kiBRecherche par date et heure
bash
# Fichiers modifiés dans les 7 derniers jours (entre aujourd'hui et il y a 7 jours)
find /home -mtime -7
# Fichiers modifiés il y a plus de 30 jours
find /var/log -mtime +30
# Fichiers modifiés aujourd'hui (dans les dernières 24 heures)
find /home -mtime 0
# Fichiers modifiés dans les dernières 24 heures
find /tmp -atime -1
# Fichier modifié il y a exactement 24 à 48 heures
find /tmp -atime 1Types de temps :
mtime: date de modification du contenuatime: date de dernier accèsctime: date de modification des métadonnées
Précisions sur les unités de temps
Les critères temporels fonctionnent avec des unités de 24 heures (jours) :
0: aujourd'hui (dernières 24 heures)1: hier (il y a 24 à 48 heures)2: avant-hier (il y a 48 à 72 heures)n: il y a n×24 heures à (n+1)×24 heures
⚠️ Important : Les plages ne sont pas fixes. Par exemple, "hier" (1) représente la période entre 24h et 48h avant l'heure actuelle, pas nécessairement la journée précédente.
Recherche par permissions
bash
# Fichiers avec permissions exactes 755
find /usr/bin -perm 755
# Fichiers avec au moins les permissions de lecture pour tous
find /home -perm -444
# Fichiers avec permissions SUID
find /usr -perm -4000Recherche par propriétaire
bash
# Fichiers appartenant à l'utilisateur 'apache'
find /var -user apache
# Fichiers dans /tmp de l'utilisateur dont l'UID est 1000
find /tmp -uid 1000
# Fichiers appartenant au groupe 'users'
find /home -group users
# Fichiers dans /var appartenant au numéro du groupe GID 100
find /var -gid 100
# Fichiers sans propriétaire valide
find /tmp -nouserCombinaison de critères
Opérateurs logiques
bash
# ET logique (par défaut)
find /home -name "*.txt" -size +1M
# OU logique -o
find /var -name "*.log" -o -name "*.txt"
# Négation -not
find /tmp -not -name "*.tmp"Exemple complexe
bash
# Fichiers .conf modifiés dans les 7 derniers jours, plus grands que 1KB
find /etc -name "*.conf" -mtime -7 -size +1k
# Fichiers .log ou .txt appartenant à l'utilisateur root
find /var -user root \( -name "*.log" -o -name "*.txt" \)
# Si on veut que le OU s'applique à l'ensemble, on utilise des parenthèses
# Fichiers .sh dans /usr ou /bin
find /usr /bin -name "*.sh"( )
Les parenthèses doivent être échappées avec des \ pour éviter qu'elles soient interprétées par le shell.
On ne colle pas les options entre elles. Il doit y avoir des espaces.
Actions sur les résultats
Actions par défaut
bash
# Affichage simple (action par défaut)
find /home -name "*.txt" -print
# Affichage détaillé
find /var -name "*.log" -lsExécution de commandes
bash
# Supprimer tous les fichiers .tmp
find /tmp -name "*.tmp" -delete
# Exécuter une commande sur chaque fichier trouvé
find /home -name "*.txt" -exec cat {} \;
# Changer le propriétaire des fichiers avec UID 1003 à 'adrien'
find / -uid 1003 -exec chown adrien {} \;
# Demander confirmation avant exécution
find /var -name "*.old" -ok rm {} \;Dans -exec :
{}représente le fichier trouvé\;termine la commande qui est exécutée
-ok
-ok comme -exec mais demande d'abord à l'utilisateur. Si l'utilisateur accepte, lance la commande.
Optimisation des performances
Par défaut, find explore récursivement tous les sous-répertoires, ce qui peut être lent sur de grands systèmes de fichiers. Voici quelques astuces pour optimiser les recherches :
Limitation de la profondeur
bash
# Recherche uniquement dans le répertoire courant
find . -maxdepth 1 -name "*.txt"
# Recherche sur 3 niveaux maximum
find /usr -maxdepth 3 -name "lib*"Exclusion de répertoires
bash
# Exclure certains répertoires
find / -path "/proc" -prune -o -name "*.conf" -print
find / -path "/sys" -prune -o -path "/proc" -prune -o -name "config*" -print-prune
L'option -prune empêche find d'entrer dans le répertoire spécifié.
La commande whereis
whereis est utilisée pour localiser les binaires, les fichiers sources et les pages de manuel d'une commande.
Il peut être utile de savoir où se trouvent les fichiers exécutables et la documentation associée à une commande spécifique.
Syntaxe et utilisation
bash
whereis [options] commandeRecherche standard
bash
# Localiser bash
whereis bash
# Résultat : bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
# Localiser ls
whereis ls
# Résultat : ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gzOptions principales
bash
# Rechercher uniquement les binaires
whereis -b python3
# Rechercher uniquement les pages de manuel
whereis -m passwd
#passwd: /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1ssl.gz /usr/share/man/man1/passwd.1.gz
# Rechercher uniquement les sources
whereis -s kernel-m
Il y a parfois plusieurs pages de manuel pour une même commande (différentes sections). On peut spécifier la section avec man 1 commande ou man 3 commande pour lire la page désirée.
La commande which
which est utilisée pour localiser l'emplacement d'un exécutable dans les répertoires listés dans la variable d'environnement PATH.
Elle est utile pour vérifier quelle version d'une commande sera exécutée lorsqu'on la lance dans le terminal car parfois plusieurs versions peuvent coexister.
Exemple : Si vous avez plusieurs version de Python installées, which python3 vous dira laquelle sera utilisée par défaut.
Utilisation de base
bash
# Trouver l'emplacement de python
which python3
# Résultat : /usr/bin/python3
# Afficher tous les emplacements possibles
which -a pythonLa commande locate
locate est une commande rapide pour rechercher des fichiers en utilisant une base de données indexée. Contrairement à find, qui explore le système de fichiers en temps réel, locate utilise une base de données pré-construite, ce qui rend les recherches très rapides.
Installation et mise à jour
bash
# Installer locate (si nécessaire)
sudo apt install mlocate
# Mettre à jour la base de données
sudo updatedbUtilisation
bash
# Recherche rapide
locate rapport.txt
# Recherche insensible à la casse
locate -i CONFIG.TXT
# Limiter le nombre de résultats
locate -n 10 "*.pdf"Exemples pratiques
Nettoyage système
bash
# Trouver et supprimer les fichiers temporaires
find /tmp -name "*.tmp" -mtime +7 -delete
# Trouver les gros fichiers (>100MB)
find /home -size +100M -lsAdministration de logs
bash
# Trouver les logs anciens
find /var/log -name "*.log" -mtime +30Sécurité
bash
# Trouver les fichiers SUID
find / -perm -4000
# Trouver les fichiers modifiables par tous
find /etc -perm -002 -type fSauvegarde
bash
# Trouver les fichiers modifiés aujourd'hui
find /home -mtime 0 -type fBonnes pratiques
Performance
- Limitez la portée : Commencez par le répertoire le plus spécifique possible
- Utilisez des filtres précoces : Placez les critères les plus sélectifs en premier
- Évitez les recherches depuis la racine : Sauf si nécessaire
Sécurité
- Attention aux actions destructives : Testez toujours avec
-printavant-delete - Droits appropriés : Certaines recherches nécessitent des privilèges root
Un peu de pratique !
Pratique 💃
Exercice 1 : Recherche de base
- Trouvez tous les fichiers
.txtdans votre répertoire home
bash
find ~ -name "*.txt"- Localisez tous les répertoires nommés
binsur le système
bash
find / -type d -name "bin"- Recherchez les fichiers plus grands que 50MB dans
/var
bash
find /var -size +50M- Trouvez tous les fichiers qui contiennent
curldans leur nom. Il peut être n'importe où dans le nom, et la recherche doit être insensible à la casse.
bash
find / -iname "*curl*"Exercice 2 : Recherche avancée
- Trouvez tous les fichiers modifiés dans les 24 dernières heures
bash
find /home -mtime 0- Localisez les fichiers appartenant à l'utilisateur
rootdans/tmp
bash
find /tmp -user root- Recherchez les fichiers avec permissions 777
bash
find / -perm 777- Trouvez tous les fichiers qui sont entre 50 kilo-octets et 1 méga-octets et qui contiennent le chiffre 1 ou 3.
bash
find / -size +50k -size -51 -name "*[13]*"- Trouvez les fichiers qui ont les droits de lecture et écriture pour le propriétaire et seulement les droits de lecture pour le groupe et les autres.
bash
find / -perm 644- Trouvez tous les fichiers qui ne terminent pas par
.logdans/var/log
bash
find /var/log -not -name "*.log"- Trouvez tous les dossier qui ne commencent pas par un point dans votre répertoire home
bash
find ~ -type d -not -name ".*"Exercice 3 : Actions sur les résultats
- Affichez une liste détaillée de tous les fichiers dans
/usr/bin
bash
find /usr/bin -type f -ls- Trouvez et changer le propriétaire des fichiers
.confdans/.configpour votre utilisateur
bash
find ~/.config -name "*.conf" -exec chown $USER {} \;- Trouvez et supprimez tous les fichiers
.logdans/tmpqui n'ont pas été modifiés depuis plus de 30 jours
bash
find /tmp -name "*.log" -mtime +30 -delete- Trouvez et supprimez tous les fichiers
.logdans/tmpqui n'ont pas été modifiés depuis plus de 30 jours en demandant confirmation avant chaque suppressions
bash
find /tmp -name "*.log" -mtime +30 -ok rm {} \;Résumé
find: Outil polyvalent pour recherche complexe avec actionswhereis: Localisation rapide de programmes et documentationwhich: Trouver des exécutables dans le PATHlocate: Recherche rapide basée sur index
Quiz 🎉
👋🏾 Cliquez sur la bonne réponse.
1 / 20 👉🏾 Quelle est la syntaxe de base de la commande `find` ?
A. find [critères] [répertoire] [actions]
B. find [répertoire] [critères] [actions]
C. find [actions] [répertoire] [critères]
D. find [répertoire] [actions] [critères]