find vs. locate

30

Es gibt die Befehle findund locatezum Suchen nach Dateien auf der Festplatte.

Ich weiß, dass findrekursiv alle benötigten Unterverzeichnisse verarbeitet, um Dateien zu durchsuchen, und daher langsam, aber aktuell ist. Dabei locatewird eine Datenbank verwendet, die von Zeit zu Zeit aktualisiert wird (wann genau?), Um schnell Ergebnisse anzuzeigen, die möglicherweise veraltet sind.

Gibt es noch andere Unterschiede? In welchen Situationen würde man die eine oder andere vorziehen? Und wann wird die locateDatenbank normalerweise aktualisiert?

Byte Commander
quelle
1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updatedb wird normalerweise täglich von cron (8) ausgeführt, um die Standarddatenbank zu aktualisieren."
Rinzwind
@Rinzwind Die verknüpfte U & L-Antwort ist fantastisch. Schade, dass wir keine Cross-Site-Duplikate erstellen können. Aber wissen Sie mehr über den Cronjob, wann genau läuft er? Nach dem Start? Nur zu einer bestimmten Zeit (ich glaube, ich habe 1-2 Uhr oder so etwas gelesen)? Was passiert, wenn es zu diesem Zeitpunkt heruntergefahren ist? Wird es gestartet, wenn sich der Computer im Leerlauf befindet? Wie kann ich das Alter der Datenbank sehen?
Byte Commander
2
@ByteCommander - Dafür anacronist es da. Ich weiß nicht, ob es standardmäßig auf Desktop-Systemen / Servern installiert ist, aber auf Notebooks. Es wird beim Booten ausgeführt und überprüft, ob Cron-Jobs ausgeführt werden sollten, während das System ausgeschaltet war, und führt sie aus. Dies ist sehr hilfreich, kann jedoch zu Problemen führen, wenn Aufträge weit entfernt von Mitternacht geplant sind. Das kann dazu führen, dass der Job beim Booten ausgeführt wird und dann wieder, wenn die Zeit abgelaufen ist - möglicherweise weniger als 24 Stunden später (für einen täglichen Job).
Joe
@ Joe Wird es also während des Startvorgangs ausgeführt und verlangsamt, oder wird es einige Zeit nach dem Start ausgeführt, oder wird es normalerweise mit einer so niedrigen Priorität ausgeführt, dass es nur ausgeführt wird, wenn das System fast im Leerlauf ist?
Byte Commander

Antworten:

27

locateist wirklich nur gut zum Finden und Anzeigen von Dateien für Menschen. Sie können ein paar Dinge damit tun, aber ich würde es nicht genug vertrauen, um es zu analysieren, und - wie Sie sagen - es ist unmöglich, den Status der internen Datenbank zu garantieren, umso mehr, als es nur /etc/cron.daily/mlocateeinmal am Tag ausgeführt werden soll!

findist live. Es filtert, schließt aus, führt aus. Es ist zum Parsen geeignet. Es können relative Pfade ausgegeben werden. Es können vollständige Pfade ausgegeben werden. Es kann Dinge tun, die auf Attributen basieren, nicht nur auf Namen.

locatehat sicherlich einen Platz in meiner Werkzeugkiste, aber es ist normalerweise ganz unten, als letzter Versuch, etwas zu finden. Es ist einfacher als findauch.

Oli
quelle
2
Ich finde locatees viel schneller, wenn ich mein gesamtes Dateisystem durchsuchen möchte. Sie können die Datenbank auch manuell aktualisieren, updatedbbevor Sie sie verwenden.
Hytromo
Sie wissen, wie dieser Cronjob genau konfiguriert ist? Läuft es zu einer bestimmten Zeit oder wenn das System inaktiv ist oder n Minuten nach dem Start? Weil ich denke, ich habe irgendwo gelesen, dass es um 1-2 Uhr morgens geplant ist, wenn mein Rechner normalerweise ausgeschaltet ist. Wird es dann nie aktualisiert, außer manuell ( sudo updatedb)? Und gibt es eine Chance zu sehen, wie alt die Datenbank ist?
Byte Commander
grep run-parts /etc/crontabSie werden feststellen, dass diese Systeme verwaltet werden anacron(was man anacronfür Systeme, die nicht ständig in Betrieb sind, ausfallsicherer ist). Soweit ich sehen kann, sollte es beim Booten ausgeführt werden, wenn Sie die ursprüngliche Cron-Zeit verpassen.
Oli
2
Ich finde, dass locate meine entfernbaren / nicht bereitgestellten Partitionen nicht indiziert. Wenn ich also etwas auf ihnen finden möchte, muss ich find verwenden. Natürlich hat locate nicht alle erstaunlichen Optionen, die find bietet - Sie möchten gerne -exec command {} \;einen Befehl für jede gefundene Datei ausführen. Ich verwende gerne locate -bdie Einschränkung locate, um Dateien zu finden, die mit der letzten Komponente des Namens übereinstimmen - ohne den Rest des Pfads. Ich versuche das oft zuerst, weil es so schnell ist. Sie können sudo updatedbdie Lokalisierungsdatenbank jederzeit aktualisieren.
Joe
Wenn Sie eine Echtzeitsuche benötigen, die auch etwas einfacher ist, können Sie so etwas wiels -R | grep 'file_name.txt'
jena
8

So sehr ich Oli mag (was sehr viel ist!), Stimme ich ihm auf findBefehl nicht zu. Es gefällt mir nicht

find Befehl dauert mehr als drei Minuten

Nehmen Sie zum Beispiel diesen einfachen Befehl:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

Es dauert mehr als 3 Minuten für findvon allem Ausgang zu suchen /. Standardmäßig werden unzählige Fehlermeldungen angezeigt, die Sie durchsuchen müssen, um das Gesuchte zu finden. Trotzdem ist es besser, als grepdas gesamte Laufwerk nach einem String zu durchsuchen, was 53 Stunden dauert : Es dauert lange, alle Dateien nach einem String zu durchsuchen

Ich weiß, dass ich mit den Parametern des Befehls find experimentieren kann, damit es besser funktioniert, aber der springende Punkt ist die Zeit, die für die Ausführung benötigt wird.

locate Befehl dauert weniger als eine Sekunde

Nun verwenden wir locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

Der Befehl locate dauert weniger als eine Sekunde!

updatedb Standardmäßig nur einmal am Tag ausführen

Es ist wahr, dass der updatedbBefehl, der die Suchdatenbank aktualisiert , standardmäßig nur einmal am Tag ausgeführt wird. Sie können es manuell ausführen, bevor Sie nach Dateien suchen, die Sie gerade hinzugefügt haben. Verwenden Sie dazu:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

Obwohl dies 3 Sekunden dauert, ist es im Vergleich zu findden über 3 Minuten des Befehls klein .

Ich habe mein aktualisiert sudo crontab -e, um die Zeile am unteren Rand einzuschließen:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

Jetzt wird alle fünf Minuten updatedbausgeführt und die locateBefehlsdatenbank ist fast immer auf dem neuesten Stand.

Aber es gibt keine Attribute?

Sie können die locateAusgabe an andere Befehle weiterleiten. Wenn Sie beispielsweise die Dateiattribute verwenden möchten, können Sie Folgendes verwenden:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

Zusammenfassung

Ich gab diese Antwort bekannt, um die Geschwindigkeit und die Benutzerfreundlichkeit von zu zeigen locate. Ich habe versucht, einige der von anderen angesprochenen Mängel des Befehls zu beheben.

Der findBefehl muss die gesamte Verzeichnisstruktur durchlaufen, um Dateien zu finden. Der locateBefehl verfügt über eine eigene Datenbank, die ihm im Vergleich eine blitzschnelle Geschwindigkeit verleiht.

WinEunuuchs2Unix
quelle
@EliahKagan Mit dem Befehl find wurden jedoch alle Verzeichnisse und Dateien auf allen Laufwerken und Partitionen durchsucht und aufgelistet. Es schien zu funktionieren und ich erwartete einen Ausdruck am Ende ... In beiden Fällen ging es nicht darum, die Suche des Suchbefehls zu "reparieren", sondern darum, die Zeit zu bestimmen. Die Ausführung locate / display-auto-brightnessdauert 17 Sekunden und zeigt außerdem jedes Verzeichnis und jede Datei auf allen Festplatten an.
WinEunuuchs2Unix
@EliahKagan Ich verstehe. --regexwar notwendig, weil mit meinem Suchbegriff zu viele Ergebnisse zurückgegeben wurden. Ich werde in wenigen Minuten zwei neue Beispiele finden, um meine Antwort zu finden und zu finden und zu aktualisieren.
WinEunuuchs2Unix
1
Um den Punkt von Eliah zu verdeutlichen, findbedeutet dieser Befehl "Drucken Sie die Dateinamen aller Dateien in den Verzeichnissen /und display-auto-brightness". Ich denke, Sie wollten verwenden find / -name display-auto-brightness, aber selbst das gibt eine Menge Junk-Fehler "Erlaubnis verweigert" aus.
wjandrea
@wjandrea Ja, wie gesagt, es ging nicht darum, die Datei zu finden, sondern um den Befehl find. Ich führe jetzt Tests mit gültigen Parametern erneut aus, nachdem ich die Caches geleert habe. Dann aktualisiere ich die Antwort.
WinEunuuchs2Unix
1
@Win Nein, Ihr Beispiel ist immer noch gültig, und ich glaube, die Verarbeitungszeit hat sich nicht wesentlich geändert, unabhängig davon, ob die Datei gefunden wurde oder nicht.
wjandrea