Skip to content

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ères
  • whereis : Localise les binaires, sources et pages de manuel d'une commande
  • which : Trouve l'emplacement d'un exécutable dans le PATH
  • locate : 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 racine
  • find . recherche à partir du répertoire courant
  • find .. recherche à partir du répertoire parent
  • find ~ /home/skabako/ recherche à partir du répertoire personnel
  • find ~ 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.log

Recherche 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égulier
  • d : répertoire
  • l : 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 -40M

Unité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 50kiB

Recherche 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 1

Types de temps :

  • mtime : date de modification du contenu
  • atime : date de dernier accès
  • ctime : 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 -4000

Recherche 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 -nouser

Combinaison 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" -ls

Exé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] commande

Recherche 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.gz

Options 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 python

La 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 updatedb

Utilisation

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 -ls

Administration de logs

bash
# Trouver les logs anciens
find /var/log -name "*.log" -mtime +30

Sécurité

bash
# Trouver les fichiers SUID
find / -perm -4000

# Trouver les fichiers modifiables par tous
find /etc -perm -002 -type f

Sauvegarde

bash
# Trouver les fichiers modifiés aujourd'hui
find /home -mtime 0 -type f

Bonnes 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 -print avant -delete
  • Droits appropriés : Certaines recherches nécessitent des privilèges root

Un peu de pratique !

Pratique 💃

Exercice 1 : Recherche de base

  1. Trouvez tous les fichiers .txt dans votre répertoire home
bash
find ~ -name "*.txt"
  1. Localisez tous les répertoires nommés bin sur le système
bash
find / -type d -name "bin"
  1. Recherchez les fichiers plus grands que 50MB dans /var
bash
find /var -size +50M
  1. Trouvez tous les fichiers qui contiennent curl dans 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

  1. Trouvez tous les fichiers modifiés dans les 24 dernières heures
bash
find /home -mtime 0
  1. Localisez les fichiers appartenant à l'utilisateur root dans /tmp
bash
find /tmp -user root
  1. Recherchez les fichiers avec permissions 777
bash
find / -perm 777
  1. 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]*"
  1. 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
  1. Trouvez tous les fichiers qui ne terminent pas par .log dans /var/log
bash
find /var/log -not -name "*.log"
  1. 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

  1. Affichez une liste détaillée de tous les fichiers dans /usr/bin
bash
find /usr/bin -type f -ls
  1. Trouvez et changer le propriétaire des fichiers .conf dans /.config pour votre utilisateur
bash
find ~/.config -name "*.conf" -exec chown $USER {} \;
  1. Trouvez et supprimez tous les fichiers .log dans /tmp qui n'ont pas été modifiés depuis plus de 30 jours
bash
find /tmp -name "*.log" -mtime +30 -delete
  1. Trouvez et supprimez tous les fichiers .log dans /tmp qui 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 actions
  • whereis : Localisation rapide de programmes et documentation
  • which : Trouver des exécutables dans le PATH
  • locate : 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]

.