So sehr ich Oli mag (was sehr viel ist!), Stimme ich ihm auf find
Befehl 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 find
von 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 grep
das 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 updatedb
Befehl, 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 find
den ü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 updatedb
ausgeführt und die locate
Befehlsdatenbank ist fast immer auf dem neuesten Stand.
Aber es gibt keine Attribute?
Sie können die locate
Ausgabe 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 find
Befehl muss die gesamte Verzeichnisstruktur durchlaufen, um Dateien zu finden. Der locate
Befehl verfügt über eine eigene Datenbank, die ihm im Vergleich eine blitzschnelle Geschwindigkeit verleiht.