which, whereis et locate sous Linux : 3 commandes pour trouver un emplacement (chemin)

Il arrive de vouloir modifier httpd.conf sans savoir où se trouve le fichier, ou d'avoir une commande du même nom à deux endroits sans savoir laquelle s'exécute. La commande Linux which trouve le fichier réellement exécuté, la commande Linux whereis trouve l'exécutable, le dossier de configuration et le manuel, et la commande locate trouve tous les chemins qui contiennent le nom. Cet article compare les trois commandes dans un tableau et vous permet de les taper vous-même sur un serveur virtuel dans le navigateur.
Sous AlmaLinux 9.8, which fait partie du paquet which 2.21 et whereis du paquet util-linux 2.37.4 : les deux sont disponibles d'emblée, tandis que locate demande d'installer à part le paquet mlocate 0.26.
✅ Différences entre which · whereis · locate
Les trois commandes ne cherchent pas au même endroit. which et whereis fouillent sur place des dossiers déterminés, tandis que locate cherche le nom dans une liste de fichiers préparée à l'avance (DB).
| Commande | Ce qu'elle trouve | Où elle cherche | Fichier nouvellement créé |
|---|---|---|---|
| which | Le fichier de commande exécuté, et les alias | Dossiers inscrits dans le PATH | Trouvé tout de suite |
| whereis | Exécutable · dossier de configuration · manuel | Dossiers déterminés comme /usr/bin · /etc · /usr/share/man | Trouvé tout de suite |
| locate | Tous les fichiers et dossiers qui contiennent le nom | DB préparée à l'avance (/var/lib/mlocate/mlocate.db) | Trouvé après updatedb |
En cherchant le même httpd avec which et whereis, la différence saute aux yeux.
~]# which httpd
/usr/sbin/httpd
~]# whereis httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd /usr/share/man/man8/httpd.8.gzlocate affiche tous les chemins dès qu'une partie du nom correspond : en tapant [locate httpd.conf], vous obtenez, en plus du fichier de configuration, le manuel (httpd.conf.5.gz) et les copies de sauvegarde.
Sur le serveur virtuel ci-dessous, choisissez which, whereis ou locate à gauche pour changer les puces ; un clic sur une puce saisit la commande. Vous pouvez aussi la taper au clavier.
Pour chercher des fichiers non pas par nom mais par taille ou date de modification, utilisez la commande find, et le chemin du dossier où vous vous trouvez s'affiche avec la commande pwd.
✅ La commande Linux which
which parcourt dans l'ordre les dossiers du PATH et affiche le premier exécutable trouvé. C'est ce fichier qui s'exécute quand vous tapez la commande.
Sous AlmaLinux, bash transmet la liste des alias à which : pour une commande dotée d'un alias, l'alias et le vrai fichier s'affichent ensemble. Si elle ne se trouve nulle part dans le PATH, [no commande in (PATH)] s'affiche.
~]# which ll
alias ll='ls -l --color=auto'
/usr/bin/ls
~]# which htop
/usr/bin/which: no htop in (/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)En pratique, la seule option est -a. Quand le même nom se trouve dans deux dossiers du PATH, elle les affiche tous, et c'est le premier qui s'exécute réellement.
~]# which ping
/usr/sbin/ping
~]# which -a ping
/usr/sbin/ping
/usr/bin/pingSous AlmaLinux 9.8, /usr/sbin/ping est un lien vers /usr/bin/ping, le résultat est donc le même. Un programme installé à la main dans /usr/local/bin s'exécute avant celui de /usr/bin, à cause de l'ordre du PATH.
[which cd] affiche /usr/bin/cd, mais quand vous tapez cd dans le shell, ce n'est pas ce fichier qui s'exécute : c'est la commande interne du shell. Pour savoir si une commande est interne, utilisez [type cd], qui affiche [cd is a shell builtin].
✅ La commande Linux whereis
whereis cherche ensemble l'exécutable et le manuel à partir du nom de la commande. Sans tenir compte du PATH, il fouille des dossiers déterminés comme /usr/bin · /usr/sbin · /usr/lib64 · /etc · /usr/share : un dossier de configuration du même nom (/etc/httpd) apparaît donc aussi.
| Option | Description | |
|---|---|---|
| -b | Exécutables seulement. Pour httpd : /usr/sbin/httpd et /usr/lib64/httpd · /etc/httpd · /usr/share/httpd | |
| -m | Manuels seulement (/usr/share/man · /usr/share/info) | |
| -s | Sources seulement. Sur une installation par défaut d'AlmaLinux 9.8, seul le nom s'affiche, comme [httpd:] | |
| -l | Liste des dossiers fouillés par whereis |
~]# whereis -b httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd
~]# whereis -m httpd
httpd: /usr/share/man/man8/httpd.8.gz
~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1ossl.gz /usr/share/man/man1/passwd.1.gzS'il ne trouve rien, seul le nom s'affiche, comme [htop:]. which renvoie le code de sortie 1 en cas d'échec et whereis renvoie 0 : pour vérifier dans un script si un programme est installé, utilisez donc which.
✅ La commande Linux locate
locate ne fouille pas le disque : il cherche le nom dans une DB préparée à l'avance. C'est rapide, mais il ne trouve pas les fichiers créés après la construction de la DB.
~]# dnf -y install mlocate
~]# updatedbJuste après l'installation, la DB n'existe pas encore et vous obtenez [locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory] ; un seul lancement d'updatedb la crée. Ensuite, mlocate-updatedb.timer reconstruit la DB une fois par jour.
Un fichier nouvellement créé n'apparaît qu'après updatedb, et un fichier supprimé continue d'apparaître jusque-là. Pour ne voir que les fichiers qui existent maintenant, ajoutez -e.
~]# touch report.txt
~]# locate report.txt
~]# updatedb
~]# locate report.txt
/root/work/report.txt
~]# rm -f report.txt
~]# locate report.txt
/root/work/report.txt
~]# locate -e report.txtLe PRUNEPATHS de /etc/updatedb.conf contient /tmp · /var/tmp · /mnt · /media : les fichiers de ces dossiers n'apparaissent pas, même après updatedb.
🔲 Options de la commande locate
| Option | Description | |
|---|---|---|
| -i | Recherche sans tenir compte de la casse | |
| -c | Seulement le nombre de résultats au lieu des chemins | |
| -l= -n | Avec un nombre après, seulement ce nombre de résultats. -l 3 | |
| -b | Recherche seulement dans le nom de fichier en fin de chemin | |
| -e | Écarte les fichiers présents dans la DB mais qui n'existent plus | |
| -S | Infos sur la DB (dossiers · fichiers · taille) | |
| -r | Recherche par expression régulière. locate -r “httpd.conf$” |
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.