Cours Linux / Trouver des fichiers et des commandes avec find, locate, which et whereis
Pour chercher des fichiers présents dans une arborescence, utilisez find ; pour interroger un index de noms déjà construit, utilisez locate. Pour savoir comment Bash interprète un nom de commande, préférez type ou command -v : which cherche généralement un exécutable dans PATH, tandis que whereis repère des fichiers associés à un programme. Ces outils répondent à des questions différentes, même lorsqu’ils affichent tous des chemins.
Un nom de fichier n’est pas son contenu : trouver notes.txt ne recherche pas une phrase à l’intérieur. Cette leçon utilise Bash et GNU find dans le Linux de pratique. Le petit atelier ne demande aucun sudo ; locate et whereis peuvent manquer dans une installation minimale.
Préparer une arborescence connue sans réutiliser un dossier
Créez trois fichiers vides dans deux sous-répertoires. linux-course-11-practice doit être un nouveau dossier de votre répertoire personnel. S’il existe déjà, changez le nom à la ligne candidat ; ne supprimez pas un ancien dossier pour faire passer la commande.
recherche=
candidat="$HOME/linux-course-11-practice"
if mkdir -- "$candidat" &&
mkdir -- "$candidat/drafts" "$candidat/archive" &&
touch -- "$candidat/drafts/notes.txt" "$candidat/drafts/todo.md" "$candidat/archive/old.txt"; then
recherche=$candidat
printf 'Atelier : %s\n' "$recherche"
else
printf '%s\n' 'Préparation échouée : vérifier les chemins et choisir un dossier neuf avant de poursuivre.' >&2
fi
La variable recherche n’est définie qu’après la réussite de toute la préparation. En cas d’erreur, un dossier partiellement créé peut rester : examinez le message et choisissez un autre nom neuf avant de recommencer. Les blocs qui utilisent test -n "$recherche" ne poursuivent pas lorsque cette variable est vide. Gardez le même terminal et ne la redéfinissez pas vers des données sans rapport avec l’atelier.
Vous disposez de drafts/notes.txt, drafts/todo.md et archive/old.txt. Les chemins complets sont placés entre guillemets pour conserver les espaces éventuels. Le cours sur les chemins absolus et relatifs explique la différence entre un nom relatif à un dossier et un chemin partant de la racine.
Rechercher les fichiers actuels avec find
find parcourt les entrées sous un ou plusieurs points de départ et applique des conditions. Placez la recherche dans l’atelier, puis cherchez les fichiers ordinaires dont le nom se termine par .txt :
test -n "$recherche" && (
cd -- "$recherche" &&
pwd &&
find . -maxdepth 2 -type f -name '*.txt'
)
pwd affiche d’abord le chemin de l’atelier. Les deux résultats suivants doivent être présents ; leur ordre n’est pas garanti :
./drafts/notes.txt
./archive/old.txt
Les parenthèses exécutent ce groupe dans un sous-shell : le changement de répertoire ne déplace pas votre shell principal. cd doit réussir avant le reste du groupe. Le fichier todo.md n’est pas affiché, car son nom ne correspond pas au motif *.txt.
- . désigne le point de départ, ici l’atelier après cd.
- -maxdepth 2 limite la descente à deux niveaux sous ce point. Le point de départ est au niveau zéro ; les dossiers drafts et archive au niveau un ; leurs fichiers au niveau deux. C’est une option GNU, à vérifier sur d’autres find.
- -type f sélectionne les fichiers ordinaires. Un dossier portant un nom se terminant par .txt ne serait pas retenu par cette condition.
- -name '*.txt' compare le nom de base au motif, pas le contenu du fichier ni tout son chemin. Les apostrophes empêchent le shell de développer * avant que find reçoive le motif.
Le manuel GNU sur la profondeur de recherche définit les niveaux ; sa section sur les motifs de noms de base explique -name et -iname. Pour observer seulement l’effet de la casse du motif, remplacez la dernière ligne par find . -maxdepth 2 -type f -iname '*.TXT'. Dans cet atelier, vous retrouvez les mêmes deux fichiers ; avec -name '*.TXT', aucun de leurs noms minuscules ne correspond.
Commencez par un dossier précis plutôt que par /. Un périmètre plus large traverse davantage d’entrées et peut rencontrer des droits insuffisants. Ne masquez pas immédiatement les diagnostics : des chemins affichés n’impliquent pas que toute la recherche a réussi, ni que vous pouvez lire chaque contenu. La recherche reflète les entrées rencontrées pendant son exécution ; des fichiers peuvent changer entre ce parcours et leur ouverture.
Ces exemples ne comportent aucune action de suppression ou de modification dans find. Vous pouvez conserver les trois fichiers vides pour refaire la comparaison. Le cours de gestion des fichiers montre comment examiner un chemin avant une suppression séparée.
Interroger un index de noms avec locate
locate consulte une base de noms produite auparavant, généralement par updatedb. Il évite de parcourir maintenant toute l’arborescence indexée, ce qui peut être utile pour une recherche large. En contrepartie, un fichier créé après la dernière mise à jour peut manquer et un nom supprimé peut encore apparaître. Les exclusions de répertoires et les règles de visibilité dépendent de l’implémentation et de sa configuration.
locate hosts
Avec plocate, un motif simple comme hosts recherche par défaut une sous-chaîne dans les chemins indexés. /etc/hosts peut figurer parmi les résultats, avec d’autres noms ; il ne s’agit pas d’une sortie universelle à reproduire. Les petits fichiers de l’atelier ne seront pas nécessairement indexés. Le manuel plocate d’Ubuntu 26.04 décrit les motifs et la visibilité des résultats.
Une absence de résultat peut donc signifier « absent de cette base ou de ce périmètre visible », et pas « inexistant sur la machine ». Vérifiez un chemin important avec ls ou une recherche find ciblée avant d’agir dessus. Un résultat indexé ne dispense pas non plus de vérifier l’état actuel et les permissions.
Sur Ubuntu 26.04, si locate n’est pas installé, préparez la base dans votre VM avec le paquet plocate :
sudo apt update &&
sudo apt install plocate &&
sudo updatedb
Vérifiez les messages d’APT avant de poursuivre. Le paquet plocate fournit l’outil ; le manuel de son updatedb décrit la construction de la base et les exclusions. Cette opération parcourt un périmètre système et écrit un index ; elle est distincte de l’atelier sans privilèges. La présence d’un déclenchement périodique et les exclusions sont à vérifier dans la configuration locale.
Sur Rocky Linux 9, cherchez d’abord le fournisseur dans les dépôts activés, sans supposer le même nom de paquet :
dnf provides '*/locate'
Choisissez le paquet effectivement proposé pour vos dépôts, puis consultez son manuel pour l’indexation. Le guide DNF de Rocky Linux 9 détaille la recherche d’un fournisseur et l’installation. Si vous ne souhaitez pas installer un indexeur, find reste utilisable directement sur l’atelier.
Distinguer un exécutable de ce que Bash exécutera
PATH est la variable qui contient les répertoires utilisés pour rechercher des commandes externes. which ls indique généralement un exécutable trouvé dans ces répertoires :
which ls
Un chemin comme /usr/bin/ls ou /bin/ls est possible, selon le système. Cependant, which n’a pas partout la même implémentation et ne représente pas automatiquement toutes les décisions de votre shell. Une fonction ou un alias peut changer le sens d’un nom saisi dans Bash. Vérifiez donc dans ce même shell :
type -a ls
command -v ls
type -a décrit les correspondances connues, y compris les alias, fonctions, commandes internes et fichiers exécutables applicables. command -v indique comment ce nom est trouvé, sous une forme concise ; sa réponse n’est pas forcément un chemin de fichier. Les résultats dépendent de votre session. Le manuel des commandes internes de Bash précise ces deux comportements.
Pour voir concrètement cette différence sans changer durablement votre session, définissez une fonction de démonstration à l’intérieur d’un sous-shell :
(
lf_demo() { printf '%s\n' 'fonction de demonstration'; }
type -a lf_demo
command -v lf_demo
lf_demo
)
type doit identifier une fonction ; command -v affiche son nom lf_demo ; l’appel affiche fonction de demonstration. La définition ajoutée ici disparaît avec le sous-shell : elle ne remplace aucune définition dans votre shell parent. Ce résultat explique pourquoi rechercher un fichier nommé lf_demo dans un dossier ne suffit pas à décrire cet appel. Les guides de type et de command présentent les autres options.
Repérer les fichiers associés à un programme avec whereis
whereis fourni par util-linux recherche les exécutables, sources et pages de manuel d’un nom dans ses emplacements de recherche. Il ne parcourt pas arbitrairement tous les dossiers et ne décrit pas les fonctions ou alias de votre Bash.
whereis ls
La sortie commence normalement par ls: puis indique les chemins trouvés. Une page de manuel ou des sources peuvent être absentes si elles ne sont pas installées ou ne se trouvent pas dans les emplacements examinés. Pour séparer deux questions, essayez :
whereis -b ls
whereis -m ls
-b restreint aux binaires, -m aux manuels. Le manuel util-linux de whereis explique les emplacements prédéfinis, PATH et MANPATH. Une liste de chemins n’est pas la preuve que votre shell utilisera le premier ; utilisez type ou command -v pour cette question.
Choisir selon ce que vous cherchez réellement
| Question | Outil adapté | Limite à vérifier |
|---|---|---|
| Quels fichiers actuels répondent à ces conditions sous ce dossier ? | find | Profondeur, droits et changements pendant le parcours |
| Quels chemins connus de la base contiennent ce nom ? | locate | Âge de la base, exclusions et visibilité |
| Quel exécutable trouve un outil de recherche dans PATH ? | which | Implémentation et différence avec la résolution du shell |
| Comment Bash interprète-t-il ce nom ici ? | type -a, command -v | Alias, fonctions et état de la session |
| Où sont les binaires ou les manuels d’un programme ? | whereis | Emplacements examinés et fichiers installés |
Si find ne renvoie rien dans cet atelier, contrôlez le chemin affiché par pwd, la casse du motif et la profondeur avant d’élargir le périmètre. Si locate ne trouve rien, vérifiez d’abord que la base existe et couvre l’emplacement voulu. Si le problème concerne une commande inattendue, examinez le résultat de type -a dans le terminal où vous la saisissez plutôt que de conclure à partir d’une liste de fichiers.




