Frage Finden vs. Lokalisieren


Da sind die Befehle find und locate um nach Dateien auf der Festplatte zu suchen.

ich weiß das find rekursiv verarbeitet alle benötigten Unterverzeichnisse, um Dateien zu suchen und ist daher langsam, aber aktuell, während locate verwendet eine Datenbank, die hin und wieder aktualisiert wird (wann genau?), um schnell Ergebnisse anzuzeigen, die jedoch veraltet sein könnten.

Gibt es noch andere Unterschiede? In welchen Situationen würde man das eine oder das andere bevorzugen? Und wann macht das? locate Datenbank wird normalerweise aktualisiert?


29
2017-09-08 13:49


Ursprung


Referenz: unix.stackexchange.com/questions/60205/ ... - Rinzwind
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 großartig, es ist eine Schande, dass wir keine Cross-Site-Duplikate erstellen können. Aber weißt du mehr über den Cronjob, wann genau wird er laufen? Nach dem Start? Zu einer bestimmten Zeit (ich glaube, ich habe 1-2 AM oder etwas ähnliches gelesen) nur? Was passiert, wenn es zu dieser Zeit geschlossen ist? Startet es, wenn der Computer im Leerlauf ist? Wie kann ich das Alter der Datenbank sehen? - Byte Commander
@ByteCommander - Das ist was anacron ist für. Ich weiß nicht, ob es standardmäßig auf Desktop-Systemen / Servern installiert ist, aber es ist auf Notebooks. Es läuft beim Booten und sieht, ob irgendwelche Cron-Jobs ausgeführt werden sollten, während das System ausgeschaltet war und sie laufen lassen. Das ist sehr hilfreich, kann jedoch zu Problemen führen, wenn Sie weit vor Mitternacht Jobs planen. Dies kann dazu führen, dass der Job beim Hochfahren ausgeführt wird, und dann wieder, wenn die Zeit abgelaufen ist - möglicherweise viel weniger als 24 Stunden später (für einen täglichen Job). - Joe
@Joe Wird es also während des Bootens ausgeführt und verlangsamt es, oder wird es einige Zeit nach dem Booten laufen, oder läuft es normalerweise mit einer so niedrigen Priorität, dass es nur läuft, wenn das System fast im Leerlauf ist? - Byte Commander


Antworten:


locate ist wirklich nur gut um Dateien zu finden und sie dem Menschen anzuzeigen. Sie können ein paar Dinge damit machen, aber ich würde ihm nicht genug vertrauen, um zu analysieren und - wie Sie sagen - es ist unmöglich, den Zustand der internen Datenbank zu garantieren, mehr noch, weil es nur dafür geplant ist, von dort zu laufen /etc/cron.daily/mlocate, einmal am Tag!

find ist live. Es filtert, schließt aus, führt aus. Es ist zum Parsen geeignet. Es kann relative Pfade ausgeben. Es kann vollständige Pfade ausgeben. Es kann Dinge basierend auf Attributen tun, nicht nur auf Namen.

locate hat sicherlich einen Platz in meiner Toolbox, aber es ist normalerweise ganz unten als ein letzter Versuch, etwas zu finden. Es ist einfacher als find auch.


27
2017-09-08 14:15



ich finde locate viel schneller sein, wenn ich mein gesamtes Dateisystem durchsuchen möchte. Und Sie können die Datenbank manuell mit aktualisieren updatedb bevor Sie es benutzen. - hytromo
Sie wissen, wie dieser Cronjob genau konfiguriert ist? Wird es zu einer bestimmten Zeit ausgeführt oder wenn das System im Leerlauf ist oder n Minuten nach dem Start? Weil ich denke, ich habe irgendwo gelesen, dass es um 1-2 Uhr geplant ist, wenn meine Maschine 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/crontab Sie werden sehen, dass diese verwaltet werden anacron (durch die du hindurch sehen wirst man anacron ist widerstandsfähiger gegenüber Systemen, die nicht ständig verfügbar sind). Von dem, was ich sehen kann, sollte es auf Boot statt laufen, wenn Sie die ursprüngliche cron Zeit verpassen. - Oli♦
Ich finde, dass locate meine entfernbaren / nicht mounten Partitionen nicht indexiert, also wenn ich etwas auf ihnen finden will, muss ich find verwenden. Natürlich hat locate nicht all die erstaunlichen Optionen, die es gibt - wie -exec command {} \; um einen Befehl für jede gefundene Datei auszuführen. Ich mag es zu benutzen locate -b Das beschränkt Locate auf das Finden von Dateien, die auf die letzte Komponente des Namens passen - ohne den Rest des Pfades. Ich versuche das oft zuerst, weil es so schnell ist. Sie können auch laufen sudo updatedb Wann immer Sie die Locate-Datenbank aktualisieren möchten. - Joe
Wenn Sie eine Suche in Echtzeit brauchen, die auch etwas einfach ist, können Sie etwas wie ls -R | grep 'file_name.txt' - jena


So sehr ich Oli mag (was sehr viel ist!) Stimme ich ihm nicht zu find Befehl. Ich mag es nicht.

find Der Befehl dauert 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 übernimmt drei Minuten zum find von Anfang an alles zu suchen /. Standardmäßig erscheinen viele Fehlermeldungen und Sie müssen diese durchsuchen, um zu finden, wonach Sie suchen. Trotzdem ist es besser als grep Das gesamte Laufwerk nach einer Zeichenfolge durchsuchen, die dauert 53 Stunden: `grep`ing alle Dateien für eine Zeichenfolge dauert eine lange Zeit

Ich weiß, dass ich mit den Parametern des Suchbefehls herumspielen kann, damit es besser funktioniert, aber der Punkt hier ist die Zeit, die es braucht, um zu laufen.

locate Befehl dauert weniger als eine Sekunde

Jetzt lass uns benutzen locate:

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

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

Das Lokalisieren Befehl dauert weniger als eine Sekunde!

updatedb nur einmal pro Tag standardmäßig ausgeführt

Es ist wahr der updatedb Befehl, der das aktualisiert Datenbank suchen wird standardmäßig nur einmal pro Tag ausgeführt. Sie können es manuell ausführen, bevor Sie nach Dateien suchen, die Sie einfach hinzugefügt haben:

$ time sudo updatedb

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

Obwohl dies 3 Sekunden dauert, ist es im Vergleich zu find Befehl ist 3+ Minuten.

Ich habe meine aktualisiert sudo crontab -e um die Linie unten einzubeziehen:

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

Jetzt alle fünf Minuten updatedb läuft und locate Befehlsdatenbank ist fast immer auf dem neuesten Stand.

Aber es gibt keine Attribute?

Du kannst pipen locate Ausgabe an andere Befehle. Wenn Sie beispielsweise folgende Dateiattribute verwenden möchten:

$ 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 habe diese Antwort gepostet, um die Geschwindigkeit und Benutzerfreundlichkeit von locate. Ich habe versucht, einige der von anderen angesprochenen Mängel zu beheben.

Das find Der Befehl muss die gesamte Verzeichnisstruktur durchlaufen, um Dateien zu finden. Das locateDer Befehl hat eine eigene Datenbank, die im Vergleich dazu blitzschnell ist.


8
2018-03-31 23:28



@EliahKagan Aber der Befehl find scrollte durch und listet alle Verzeichnisse und Dateien auf allen Laufwerken und Partitionen auf. Es schien zu funktionieren und ich erwartete am Ende einen Ausdruck ... Wie auch immer, es ging nicht darum, die Suche des Suchbefehls zu "reparieren", es ging darum, die Zeit zu bekommen. Laufen locate / display-auto-brightnessdauert 17 Sekunden und zeigt außerdem jedes Verzeichnis und jede Datei auf allen Festplatten an. - WinEunuuchs2Unix
@EliahKagan Ich verstehe. --regex war notwendig, weil zu viele Ergebnisse mit meiner Suchzeichenfolge zurückgegeben wurden. Ich werde zwei neue Beispiele finden, um meine Antwort in wenigen Minuten zu finden und zu aktualisieren. - WinEunuuchs2Unix
Um Eliahs Standpunkt zu klären find Befehl bedeutet "Drucken Sie die Dateinamen aller Dateien in den Verzeichnissen / und display-auto-brightness. " Ich glaube, du wolltest es benutzen find / -name display-auto-brightness, aber selbst das druckt eine Menge Junk "Permission denied" Fehler. - wjandrea
@wjandrea Ja wie gesagt der Punkt war nicht die Datei zu finden, es war mal der Suchbefehl. Ich mache jetzt Tests mit gültigen Parametern nach dem Ausspülen von Caches. Dann werde ich die Antwort aktualisieren. - WinEunuuchs2Unix
@ Win Nein, Ihr Beispiel ist immer noch gültig, und ich glaube nicht, dass die Verarbeitungszeit viel geändert wird, ob die Datei gefunden wird oder nicht. - wjandrea