Quelle est la différence fondamentale entre la commande locate
whereis
et which
.
La différence fondamentale que j'ai observée est que locate
localise tous les noms de fichiers associés dans tout le système de fichiers, alors que les commandes whereis
et which
ne donnent que l'emplacement (adresse système/locale du fichier) de application installée. Quelle est la précision de mon observation?
Comment ces commandes sont-elles implémentées en interne? Pourquoi locate
fonctionne-t-il si rapidement par rapport à la recherche par tiret, alors que locate
doit rechercher un nom de fichier particulier correspondant à la chaîne cible dans la hiérarchie du système de fichiers?
which
trouve l'exécutable binaire du programme (s'il se trouve dans votre PATH). man which
explique plus clairement:
qui renvoie les noms de chemin des fichiers (ou liens) qui seraient exécutés dans l'environnement actuel si ses arguments avaient été fournis sous forme de commandes dans un shell strictement conforme à POSIX. Pour ce faire, il recherche dans le PATH les fichiers exécutables correspondant aux noms des arguments. Il ne suit pas de liens symboliques.
whereis
trouve le binaire, la source et les fichiers de page de manuel d'un programme. Par exemple
$ whereis gimp
/usr/bin/gimp /usr/lib/gimp /etc/gimp /usr/share/gimp /usr/share/man/man1/gimp.1.gz
Vous pouvez obtenir des détails supplémentaires en transmettant la sortie de ces commandes sous forme d'arguments à ls -l
ou file
.
$ ls -l $(which gimp)
lrwxrwxrwx 1 root root 8 Jun 30 19:59 /usr/bin/gimp -> gimp-2.8
$ file $(which gimp)
/usr/bin/gimp: symbolic link to gimp-2.8
locate
trouve en effet tous les fichiers dont le motif est spécifié n'importe où dans leur chemin. Vous pouvez lui indiquer de ne rechercher que les fichiers et les répertoires dont noms (plutôt que les chemins d'accès complets) incluent le motif avec l'option -b
, qui correspond généralement à ce que vous souhaitez, et donne une liste moins compliquée. .
locate
est rapide car il utilise une base de données binaire qui est mise à jour périodiquement (une fois par jour, par cron
). Vous pouvez le mettre à jour vous-même pour vous assurer que les fichiers récemment ajoutés sont trouvés en exécutant Sudo updatedb
Une dernière chose à propos de locate
- peu importe que les fichiers existent ou non, aussi, pour éviter de trouver des fichiers récemment supprimés, utilisez -e
. Souvent, je dirige aussi vers less
car la liste peut être longue. Typiquement je fais:
Sudo updatedb && locate -b -e gimp | less
Le fonctionnement du tiret de Unity est expliqué ici - il utilise Zeitgeist pour indexer les fichiers système et tirer des enseignements des modèles d'utilisation, et permet à d'autres applications d'utiliser ces données. beaucoup plus de travail que locate
.
Simplement
$ which samba
quelle commande cherche dans la liste des programmes listés dans les paramètres de PATH
$ whereis samba
la commande whereis recherche également les programmes qui ne sont pas présents dans le paramètre PATH
$locate samba
Trouve également les fichiers par nom de fichier, mais ne recherche pas dans la structure de répertoires elle-même, mais uniquement dans une base de données préparée par updatedb. A cause de cela, localiser est plus rapide que trouver mais moins précis. Exemples: