locate sucht Dateien nicht live im Dateisystem, sondern über eine vorab gepflegte Datenbank aller bekannten Pfade. Das Ergebnis ist meist in Sekundenbruchteilen da — die Kehrseite: Was nach dem letzten Datenbank-Update entstanden oder verschoben wurde, fehlt. locate ist damit das schnelle Komplement zu find, das jedes Mal frisch durch das Dateisystem läuft.
Was locate macht
Statt das Dateisystem live zu durchwandern, fragt locate eine kompakte Datenbank ab, die typischerweise unter /var/lib/mlocate/mlocate.db oder /var/lib/plocate/plocate.db liegt. Die Datenbank enthält die Pfade aller Dateien und Verzeichnisse, die beim letzten Lauf von updatedb indiziert wurden.
locate readme.mdDas eigentliche Trade-off lautet: Geschwindigkeit gegen Aktualität. locate antwortet sofort, kennt aber nur den Stand der letzten Indexierung. find liest immer das aktuelle Dateisystem, braucht dafür aber bei großen Bäumen spürbar Zeit.
locate vs. find
| Aspekt | locate | find |
|---|---|---|
| Geschwindigkeit | Sehr schnell (DB-Lookup) | Linear zur Baumtiefe und Anzahl Dateien |
| Aktualität | So alt wie die letzte updatedb-Ausführung | Immer live, vom Dateisystem gelesen |
| Filter | Nur Pfad/Name, einfache Patterns und Regex | Größe, Zeit, Typ, Berechtigungen, Tiefe, Eigentümer |
| Aktionen | Nur Pfade ausgeben | -exec, -delete, -print0 etc. |
| Permissions | Sieht alle indizierten Pfade — auch jene, die der Aufrufer nicht lesen darf | Sieht nur, was der Aufrufer im Live-Lauf erreichen kann |
| Geltungsbereich | Globaler Index laut updatedb.conf | Beliebiger Startpfad, beliebige Tiefe |
Datenbank pflegen mit updatedb
Die Datenbank wird von updatedb aufgebaut. Auf den meisten Distributionen läuft das automatisch — entweder als Cron-Job in /etc/cron.daily/ oder über einen systemd-Timer wie updatedb.timer oder plocate-updatedb.timer. Ein Aufruf pro Tag ist der typische Rhythmus.
sudo updatedbKonfiguriert wird updatedb in /etc/updatedb.conf. Wichtige Schalter:
| Variable | Bedeutung |
|---|---|
PRUNEPATHS | Pfade, die nicht indiziert werden — typisch /tmp /var/tmp /var/spool /media |
PRUNEFS | Dateisystem-Typen, die übersprungen werden — z. B. nfs cifs sshfs proc tmpfs |
PRUNENAMES | Verzeichnisnamen, die überall ausgeschlossen werden — etwa .git .cache |
PRUNE_BIND_MOUNTS | Bind-Mounts überspringen, damit Inhalte nicht doppelt erscheinen |
Wer also /proc, ein remote gemountetes NFS-Share oder den Browser-Cache nicht im Index haben möchte, trägt das hier ein. Nach Änderungen ist ein einmaliger sudo updatedb-Lauf nötig.
Wichtige Optionen
| Option | Wirkung |
|---|---|
-i | Suche ohne Beachtung von Groß-/Kleinschreibung |
-c | Nur die Anzahl Treffer ausgeben, nicht die Pfade |
-l N | Höchstens N Ergebnisse zurückgeben |
-r | Argument als Basic Regex interpretieren |
-A | Alle angegebenen Patterns müssen matchen (UND-Verknüpfung) |
-b | Nur Basenamen vergleichen, nicht den vollen Pfad |
--existing | Nur Treffer ausgeben, deren Datei beim Lookup tatsächlich existiert |
-0 | Treffer durch Nullbyte trennen — sicher für xargs -0 |
Nicht jede Implementierung kennt jede Option. mlocate und plocate decken die wichtigsten ab; klassisches GNU-locate weicht in Detail-Flags ab. Im Zweifel hilft locate --help oder man locate.
mlocate vs. plocate
Historisch war slocate und später mlocate der Standard. mlocate führte die Permission-prüfende Variante ein und merkt sich, welche Pfade indiziert wurden, um Updates inkrementell zu machen.
Seit 2021/22 setzen viele moderne Distributionen auf plocate — von Steinar H. Gunderson geschrieben. Vorteile:
- Deutlich schnellere Suche durch ein invertiertes Trigramm-Index-Format
- Kleinere Datenbank — oft nur ein Bruchteil der
mlocate-DB - Drop-in-kompatibel: das Kommando
locateist meist ein Alias auf den aktiven Backend
Arch Linux hat 2021 von mlocate auf plocate gewechselt, Fedora zog 2022 nach. Debian und Ubuntu bieten beide an, der Default verschiebt sich seit Bookworm/Jammy klar in Richtung plocate. Welcher Backend aktiv ist, verrät locate --version oder which locate und ein Blick auf das Paket.
Praxis
locate readme.mdDas Argument matcht als Substring im Pfad — jede Datei, deren voller Pfad readme.md enthält, wird gelistet. Bei populären Begriffen also gerne mit head oder einem zusätzlichen grep einschränken.
locate -i nvim | head-i ignoriert Groß-/Kleinschreibung, sodass auch NVIM oder Nvim matchen. head reicht, wenn nur die ersten Treffer interessieren — sinnvoll bei Begriffen, die Hunderte Pfade liefern.
locate -r '\.conf$'Mit -r wird das Argument als Basic Regex statt Substring interpretiert. Der $-Anker erzwingt, dass .conf am Pfad-Ende steht — sonst würden auch Pfade wie /etc/nginx/conf.d/site.bak matchen.
locate --existing nginx.conf--existing filtert Stale-Einträge heraus, deren Datei seit dem letzten updatedb-Lauf gelöscht wurde. Etwas langsamer, weil locate jeden Treffer per stat verifiziert — dafür spiegelt das Resultat den echten Stand auf der Platte wider.
Wann find statt locate? Immer dann, wenn
- die Datei gerade frisch entstanden ist und im Index noch fehlt,
- die Suche an Dateieigenschaften hängt (Größe, mtime, Typ, Eigentümer),
- direkt eine Aktion ausgeführt werden soll (
-exec,-delete), - ein eingegrenzter Startpfad mit Tiefenlimit gefragt ist.
Für reine „wo lag das nochmal”-Fragen ist locate aber unschlagbar schnell.
Besonderheiten
Die Datenbank ist immer ein wenig in der Vergangenheit
Wenn du eine Datei vor zehn Minuten angelegt hast, findet locate sie typischerweise nicht — der Index wird meist nur einmal pro Tag erneuert. Ein sudo updatedb aktualisiert ihn sofort, dauert aber je nach Festplattengröße einige Sekunden bis Minuten. Für „eben erst gespeichert”-Szenarien ist find die richtige Wahl.
locate kann Pfade zeigen, die du gar nicht lesen darfst
In klassischen Implementierungen lief updatedb als root und der Index war für alle Nutzer lesbar — das verriet die Existenz fremder Dateien. mlocate löst das, indem die Datenbank vom locate-Binary mit setgid-Rechten gelesen wird und vor jeder Ausgabe geprüft wird, ob der Aufrufer den Pfad tatsächlich erreichen darf. plocate verfolgt einen ähnlichen Ansatz mit eigenem Permission-Check. Auf alten Systemen mit reinem locate solltest du das im Hinterkopf behalten.
Wenn etwas fehlt — erst updatedb.conf prüfen
Ein Klassiker: locate findet eine Datei nicht, obwohl sie existiert. Ursache ist oft kein veralteter Index, sondern ein PRUNEPATHS- oder PRUNEFS-Eintrag, der das Verzeichnis bzw. das Dateisystem aus dem Index ausschließt. Ein Blick in /etc/updatedb.conf klärt das schnell.
--existing räumt auf
Stale-Einträge entstehen, wenn Dateien zwischen zwei updatedb-Läufen gelöscht werden. Mit locate --existing filterst du diese vor der Ausgabe heraus — ein bisschen langsamer, aber das Ergebnis spiegelt den Stand auf der Platte.
locate findet keine Inhalte
locate arbeitet ausschließlich auf Pfaden und Dateinamen. Wer im Inhalt von Dateien sucht, braucht grep -r, ripgrep oder spezialisierte Tools wie ag. Eine Kombination ist üblich: locate -r '\.md$' | xargs grep -l SuchBegriff.
systemd-Timer statt cron
Auf modernen Systemen läuft updatedb häufig nicht mehr per cron.daily, sondern über einen systemd-Timer. Mit systemctl list-timers siehst du, ob z. B. plocate-updatedb.timer aktiv ist und wann der nächste Lauf ansteht. Bei Laptops ist das praktisch, weil systemd verpasste Läufe nachholen kann (Persistent=true).
Weiterführende Ressourcen
Externe Quellen
- man locate (man7.org) — Die Standard-Manpage
- plocate Project (Steinar H. Gunderson) — Projektseite und technische Hintergründe zu plocate
- Arch Wiki: plocate — Installation, Konfiguration und Timer
- GNU findutils — Klassisches
locate/updatedbals Teil der findutils - man updatedb.conf — Detailreferenz zu PRUNEPATHS, PRUNEFS und Co.
Verwandte Artikel
- find – Dateien live suchen — Das mächtige Live-Pendant zu locate
- ls – Verzeichnisinhalte anzeigen — Dateien im aktuellen Verzeichnis listen
- which – Programme im PATH finden — Speziell für ausführbare Dateien
- Linux Dateisystem — Übersicht aller Werkzeuge rund um Dateien
- Linux Verzeichnisstruktur — Wo welche Dateien standardmäßig liegen