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.

Bash Schnelle Pfadsuche
locate readme.md

Das 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

Aspektlocatefind
GeschwindigkeitSehr schnell (DB-Lookup)Linear zur Baumtiefe und Anzahl Dateien
AktualitätSo alt wie die letzte updatedb-AusführungImmer live, vom Dateisystem gelesen
FilterNur Pfad/Name, einfache Patterns und RegexGröße, Zeit, Typ, Berechtigungen, Tiefe, Eigentümer
AktionenNur Pfade ausgeben-exec, -delete, -print0 etc.
PermissionsSieht alle indizierten Pfade — auch jene, die der Aufrufer nicht lesen darfSieht nur, was der Aufrufer im Live-Lauf erreichen kann
GeltungsbereichGlobaler Index laut updatedb.confBeliebiger 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.

Bash Manuell aktualisieren
sudo updatedb

Konfiguriert wird updatedb in /etc/updatedb.conf. Wichtige Schalter:

VariableBedeutung
PRUNEPATHSPfade, die nicht indiziert werden — typisch /tmp /var/tmp /var/spool /media
PRUNEFSDateisystem-Typen, die übersprungen werden — z. B. nfs cifs sshfs proc tmpfs
PRUNENAMESVerzeichnisnamen, die überall ausgeschlossen werden — etwa .git .cache
PRUNE_BIND_MOUNTSBind-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

OptionWirkung
-iSuche ohne Beachtung von Groß-/Kleinschreibung
-cNur die Anzahl Treffer ausgeben, nicht die Pfade
-l NHöchstens N Ergebnisse zurückgeben
-rArgument als Basic Regex interpretieren
-AAlle angegebenen Patterns müssen matchen (UND-Verknüpfung)
-bNur Basenamen vergleichen, nicht den vollen Pfad
--existingNur Treffer ausgeben, deren Datei beim Lookup tatsächlich existiert
-0Treffer 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 locate ist 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

Bash Einfacher Treffer
locate readme.md

Das 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.

Bash Case-insensitive, gekürzt
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.

Bash Regex auf Endung
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.

Bash Nur tatsächlich vorhandene Treffer
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

/ Weiter

Zurück zu Dateisystem

Zur Übersicht