Was ist der Unterschied zwischen locate / whereis / which?

13

Was ist der grundlegende Unterschied zwischen locate whereisund whichBefehl.

Der grundlegende Unterschied, den ich festgestellt habe, besteht darin, dass locatealle zugehörigen Dateinamen im gesamten Dateisystem gefunden werden, wohingegen whereisund which-Befehle nur den Speicherort (System / lokale Adresse der Datei) der installierten Anwendung angeben. Wie genau ist meine Beobachtung?

Wie werden diese Befehle intern implementiert? Warum arbeitet locatedie Suche im Vergleich zur Bindestrichsuche so schnell, während locateein bestimmter Dateiname gesucht werden muss, der mit der Zielzeichenfolge in der gesamten Dateisystemhierarchie übereinstimmt?

Chinmaya B
quelle
2
und was ist type? : P
Jamesmstone
@ Jamesmstone was meinst du mit type, bitte erläutern
Chinmaya B
2
Entschuldigung, ich habe nur versucht, Ihre Frage zu ergänzen. typeist ein weiterer Befehl, der (aus meiner Sicht) etwas Ähnliches zu den von Ihnen genannten zu tun scheint.
Jamesmstone
@ Jamesmstone Ich glaube nicht, dass es einen Typ-Befehl gibt, der in meinem System funktioniert. Ich kann keine Handbuch- oder Informationsseite für den typeBefehl finden. Ich habe versucht man typeund info type.
Chinmaya B
Hmm, ich frage mich warum ... Benutzt du Bash?
Jamesmstone

Antworten:

17

whichFindet die ausführbare Binärdatei des Programms (falls sie sich in Ihrem PATH befindet). man whicherklärt deutlicher:

Dies gibt die Pfadnamen der Dateien (oder Links) zurück, die in der aktuellen Umgebung ausgeführt werden würden, wenn die Argumente als Befehle in einer streng POSIX-konformen Shell angegeben worden wären. Dazu durchsucht es den Pfad nach ausführbaren Dateien, die mit den Namen der Argumente übereinstimmen. Es folgen keine symbolischen Links.

whereisFindet die Binär-, Quell- und Manpage-Dateien für ein Programm. Beispielsweise

$ whereis gimp
/usr/bin/gimp /usr/lib/gimp /etc/gimp /usr/share/gimp /usr/share/man/man1/gimp.1.gz

Sie können zusätzliche Details erhalten, indem Sie die Ausgabe dieser Befehle als Argumente an ls -loder übergebenfile

$ 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

locatefindet in der Tat alle Dateien, die das angegebene Muster irgendwo in ihren Pfaden haben. Sie können festlegen, dass nur Dateien und Verzeichnisse gefunden werden sollen, deren Namen (anstelle vollständiger Pfade) das Muster mit der -bOption enthalten, die normalerweise gewünscht wird, und eine weniger unhandliche Liste enthält.

locate ist schnell, weil es eine binäre Datenbank verwendet, die regelmäßig aktualisiert wird (einmal täglich von cron ). Sie können es selbst aktualisieren, um sicherzustellen, dass kürzlich hinzugefügte Dateien gefunden werdensudo updatedb

Noch etwas locate: Es ist egal, ob noch Dateien vorhanden sind oder nicht. Um zu vermeiden, dass kürzlich gelöschte Dateien gefunden werden, verwenden Sie -e. Oft pfeife ich auch zu, lessda die Liste lang sein kann. Normalerweise mache ich:

sudo updatedb && locate -b -e gimp | less

Die Funktionsweise von Unitys Dash wird hier erläutert. Mithilfe von Zeitgeist werden Systemdateien indiziert und anhand von Verwendungsmustern gelernt. Außerdem können andere Anwendungen diese Daten verwenden locate.

Zanna
quelle
Können Sie die Befehlsleistung und Implementierungsdetails vergleichen und lokalisieren? Die Aktualisierung der Binärdatenbank sollte nach dem Erstellen einer neuen Datei im System erfolgen, nicht wahr? Diese Zeitspanne wäre unbestimmt korrekt, oder wird sie von Systemprozessen verwaltet?
Chinmaya B
2
Die automatische Aktualisierung der Datenbank durch @Creator wird von cron einmal pro Tag durchgeführt. Sie können überprüfen, wann Sie etwas installieren, mit dem Sie die Dateien nicht sofort finden können locate. Der Bindestrich verwendet einen völlig anderen Index - langsamer, weil er mehr Aufgaben erledigt (ich habe meine Antwort bearbeitet)
Zanna
1
Zusammenfassend ist locate also nützlich und leistungsfähiger als which oder whereis, aber dumm, während dash leistungsfähiger ist und maschinelles Lernen implementiert. und danke für sudo updatedbdein befehl ist sehr hilfreich wusste nicht, dass ich -e zwar regelmäßig benutzte.
Chinmaya B
@Creator yep du hast es besser formuliert :) froh, dass es geholfen hat
Zanna
0

Einfach

$ which samba

Dieser Befehl durchsucht die Liste der Programme, die in den PATH-Einstellungen aufgelistet sind

$ whereis samba

Der Befehl whereis sucht auch nach Programmen, die in der Einstellung PATH nicht vorhanden sind

$locate samba

Findet auch Dateien nach Dateinamen, durchsucht aber nicht die Verzeichnisstruktur selbst, sondern nur eine von updatedb vorbereitete Datenbank. Aus diesem Grund ist das Auffinden schneller als das Auffinden, jedoch weniger genau. Beispiele:

Null Zeiger
quelle