Der Befehl locate
Der Befehl locate wird für die Suche nach Dateien und Verzeichnissen unter Linux- bzw. UNIX- Betriebssystemen verwendet. locate greift dazu auf eine oder mehrere Datenbankdateien zurück, welche alle Datei- und Verzeichnisnamen des Dateisystems beinhalten. Im Vergleich zu dem bereits in einem anderen Beitrag vorgestellten Befehl find wird also nicht bei jeder Suche das gesamte Dateisystem durchsucht, sondern eine regelmäßig aktualisierte Datenbank.
In diesem Beitrag lernen Sie die grundlegende Funktionsweise von dem Befehl locate und seinen Optionen kennen und erfahren außerdem, welchen Vorteil locate Ihnen tatsächlich bringt.
Installation
Für die Verwendung des locate Befehls wird ein gleichnamiges Paket benötigt. Dieses ist nicht auf allen Linux-/UNIX- Betriebssystemen, wie beispielsweise Debian, vorinstalliert.
Die Installation können Sie mit dem folgenden Befehl nachholen:
apt-get install locate
Wenn Sie näheres zur Paket- und Quellenverwaltung mit apt erfahren wollen, lesen Sie auch unseren Beitrag zu diesem Thema.
Aktualisieren der Datenbank
Für die Aktualisierung der Datenbank kommt das Programm / der Befehl updatedb zum Einsatz, welcher mit dem Paket "locate" ebenfalls installiert wird. updatedb wird standardmäßig täglich durch den Cron-Daemon ausgeführt. Das zugehörige Skript befindet sich dazu im Verzeichnis /etc/cron.daily.
Die Dateinamen-Datenbank kann aber auch manuell aktualisiert / geupdatet werden. Gerade, wenn Sie locate frisch installiert, oder viele Änderungen am Dateisystem vorgenommen haben, sollten Sie dies tun. Die allgemeine Syntax lautet:
updatedb [Optionen]
Wichtige Optionen
Sie können updatedb grundsätzlich ohne Angabe jeglicher Optionen ausführen, um Ihr Dateisystem zu indexieren. Im Folgenden sollen dennoch einmal einige der wichtigsten Optionen dieses Befehls erläutert werden.
--localpaths - Verzeichnisse spezifizieren
Mit der Option --localpaths haben Sie die Möglichkeit, Nicht-Netzwerk Verzeichnisse auszuwählen, die in die Datenbank aufgenommen werden sollen.
updatedb --localpaths='[Verzeichnis(se)]'
Mehrere Verzeichnisse werden durch Leerzeichen getrennt hintereinander aufgelistet. Der Standardwert für diese Option ist '/'.
--prunepaths - Verzeichnisse ausschließen
Über die Option --prunepaths haben Sie die Möglichkeit, Verzeichnisse auszuschließen, die andernfalls in die Datenbank aufgenommen werden würden:
updatedb --prunepaths='[Verzeichnis(se)]'
Mehrere Verzeichnisse werden auch hier wieder durch Leerzeichen getrennt. Beachten Sie außerdem, dass jegliche abschließende Schrägstriche entfernt werden müssen, da die Pfade sonst nicht erkannt werden. Der Standardwert für diese Option ist '/tmp /usr/tmp /var/tmp /afs'.
--output - Datenbankdatei festlegen
Hiermit können Sie die ausgegebene Datenbankdatei festlegen.
updatedb --output=[Datenbankdatei]
Der Standardwert für diese Option ist vom verwendeten System abhängig. Unter Debian befindet sich die Datenbankdatei standardmäßig unter /var/cache/locate/locatedb.
Die Suche mit locate
Die allgemeine Syntax des Befehls locate lautet:
locate [Optionen] [Suchmuster]
Für jedes gegebene Suchmuster durchsucht locate eine oder mehrere Datenbanken nach Datei- und Verzeichnisnamen, die mit dem Muster übereinstimmen. Bei der Definition von Suchmustern haben Sie die Möglichkeit, neben einfachen Zeichenfolgen auch Wildcards zu verwenden: Erlaubt sind der Stern '*', das Fragezeichen '?' und die eckigen Klammern '[]'. Damit diese nicht von der Shell interpretiert werden, sollten solche Suchmuster mit Hochkommata umschlossen werden.
Wenn es sich bei einem Suchmuster um eine einfache Zeichenkette ohne jegliche Wildcards handelt, dann zeigt locate alle Dateien und Verzeichnisse, die die gegebene Zeichenkette an beliebiger Stelle in Ihrem Namen beinhalten. Bei Suchmustern, die Wildcards enthalten, werden dagegen nur solche Ergebnisse angezeigt, die diesem genau entsprechen. Aus diesem Grund starten und enden Suchmuster in den meisten Fällen mit einem Stern '*'.
Wenn Sie genaueres zur Funktionsweise von Wildcards unter Linux/UNIX erfahren wollen, dann lesen Sie auch unseren Beitrag dazu.
Beispiel: Locate
In diesem Beispiel soll zunächst einmal eine einfache Suche ohne jegliche Optionen und Wildcards durchgeführt werden. Suchmuster ist hierbei das Wort "befehl".
Eingabe:
locate befehl
Ausgabe:
Es werden alle Dateien bzw. Verzeichnisse ausgegeben, die an beliebiger Stelle in Ihrem Namen das Wort "befehl" beinhalten.
Beispiel: Locate mit Wildcards
Dieses Beispiel verdeutlicht die Verwendung von Wildcards in der Suche. Das Suchmuster ist mit Hochkommata umschlossen und beinhaltet die Wildcards '*' und '?'. Erwartet werden hier alle Dateien mit einer drei Zeichen langen Dateiendung (".???"), die an beliebiger Stelle in einem Unterverzeichnis "/administration/" liegen.
Eingabe:
locate '*/administration/*.???'
Ausgabe:
Es werden zwei Textdateien ausgegeben, die genau dem Suchmuster entsprechen.
Wichtige Optionen
Der Befehl locate bietet schließlich auch noch einige Optionen, welche seine Funktionalität erweitern. Die wichtigsten dieser Optionen werden nun einmal kurz erläutert.
-A - Übereinstimmung mit allen Mustern
Mit der Option -A (All) legen Sie fest, dass nur solche Datei-/Verzeichnisnamen ausgegeben werden, die mit allen angegebenen Suchmustern übereinstimmen. Wenn ein Suchergebnis beispielsweise nur mit einem von mehreren Suchmustern übereinstimmt, wird es nicht ausgegeben:
locate -A [Suchmuster]
Beispiel: Locate mit -A
Hierbei sollen nur solche Ergebnisse ausgegeben werden, die mit beiden Suchmustern "grundlagen" und ".txt" übereinstimmen.
Eingabe:
locate -A grundlagen .txt
Ausgabe:
Nach der Ausführung werden drei Textdateien ausgegeben, die mit beiden Suchmustern übereinstimmen: Die Pfade bzw. Dateinamen enthalten sowohl "grundlagen", als auch ".txt". Wenn wir die Option -A dagegen nicht verwendet hätten, dann würde locate auch solche Ergebnisse ausgeben, in denen nur eines der beiden Suchmuster vorkommt.
-c - Anzahl Ergebnisse ausgeben
Die Option -c (count) führt zur Ausgabe der Gesamtanzahl gefundener Suchergebnisse. Die Namen der Suchergebnisse werden nicht ausgegeben.
locate -c [Suchmuster]
Beispiel: Locate mit -c
In diesem Beispiel wird die Option -c verwendet, um die Anzahl Dateien mit der Dateiendung .txt auszugeben.
Eingabe:
locate -c '*.txt'
Ausgabe:
416
-d - Datenbankpfad festlegen
Mit der Option -d (database path) können Sie, statt der Standard-Datenbank, auch eine oder mehrere andere Datenbanken für die Suche verwenden. Parameter dieser Option ist eine durch den Doppelpunkt ':' getrennte Auflistung von Datenbankpfaden.
locate -d [Datenbankpfad(e)] [Suchmuster]
Leere Datenbanken werden als Synonym für die Standard-Datenbank interpretiert.
Beispiel: Locate Datenbankpfad festlegen
Eingabe:
locate -d /home/hellberg/profi-tutorials.db:/home/hellberg/it-consulting.db
Ausgabe:
Hier werden die beiden Datenbankdateien /home/hellberg/profi-tutorials.db und /home/hellberg/it-consulting.db für die Suche verwendet. Es werden alle Ergebnisse aus beiden Datenbanken gezeigt.
-i - Groß- und Kleinschreibung ignorieren
Die Groß- und Kleinschreibung wird durch die Option -i (ignore case) sowohl in den Suchmustern, als auch in den Dateinamen ignoriert.
locate -i [Suchmuster]
-l - Anzahl Ergebnisse limitieren
Durch Angabe der Option -l (limit) können Sie die maximale Anzahl Suchergebnisse für die Suche festlegen. Die Anzahl Suchergebnisse, die mit der -c Option ausgegeben wird, wird dieses Limit ebenfalls nie überschreiten.
locate -l [Limit] [Suchmuster]
Der Vorteil des Befehls locate
Die von locate verwendeten Datenbanken enthalten Listen von Dateien, die sich zum Zeitpunkt der letzten Aktualisierung auf dem System befanden. Dateien und Verzeichnisse, welche in den Suchergebnissen von locate gezeigt werden, spiegeln daher auch nicht den aktuellen Stand, sondern den Stand der Datenbank wider - Dateien und Verzeichnisse, welche erst nach der letzten Aktualisierung erstellt bzw. angelegt wurden, tauchen auch nicht in den Suchergebnissen auf.
Solange die gesuchten Dateien jedoch im Index vorhanden sind und die Datenbanken regelmäßig durch den Systemadministrator aktualisiert werden, besitzt locate einen hohen Geschwindigkeitsvorteil gegenüber anderen Befehlen - wie beispielsweise find. Dieser Unterschied wird im Folgenden einmal beispielhaft veranschaulicht:
Beispiel: Zeitmessung find und locate
In diesem Beispiel soll einmal kurz der Unterschied bei der Suchgeschwindigkeit zwischen den beiden Befehlen find und locate verdeutlicht werden.
Wir werden dazu einmal die Ausführungszeit der beiden Befehle genauer betrachten. Unter Linux bzw. UNIX ist die Messung der Ausführungszeit für ein Befehlszeilenprogramm mit dem time Befehl möglich. Er wird dazu einfach vor den auszuführenden Befehl gestellt.
Eingabe:
Zunächst führen wir eine ganz normale Suche mit dem find Befehl aus und messen dabei die Ausführungszeit.
time find / -name befehl-grep.txt
Ausgabe:
Die gesamte tatsächliche Ausführungszeit (real) beträgt hier etwa eine halbe Sekunde. Dies scheint zwar nicht nach einer sehr langen Zeit auszusehen, jedoch ist das in diesem Beispiel verwendete Dateisystem auch relativ klein.
real 0m0,440
user 0m0,112
sys 0m0,320
Eingabe:
Als Nächstes führen wir dieselbe Suche mit dem Befehl locate aus.
time locate befehl-grep.txt
Ausgabe:
Die gesamte Ausführungzeit (real) für die Suche mit dem locate Befehl beträgt lediglich 0,064s - das ist fast nur ein Siebtel der Ausführungszeit von find! Selbstverständlich wird dieser Zeitvorteil aber auch dann erst wirklich interessant, wenn sehr viel größere Dateimengen durchsucht werden müssen.
real 0m0,064
user 0m0,052
sys 0m0,008