Ich würde gerne "find" und "locate" verwenden, um in meinem Projekt nach Quelldateien zu suchen, aber die Ausführung dauert sehr lange. Gibt es schnellere Alternativen zu diesen Programmen, die ich nicht kenne, oder Möglichkeiten, die Leistung zu beschleunigen? dieser Programme?
22
locate
sollte schon schnell genug sein, wenn man bedenkt, dass es einen vorgefertigten Index verwendet (der wichtigste Vorbehalt ist, dass es auf dem neuesten Stand gehalten werden muss), währendfind
die Verzeichnislisten gelesen werden müssen.find /usr/src -name fprintf.c
auf meiner OpenBSD-Desktop-Maschine laufe, werden die Speicherorte dieser Quelldateien in weniger als 10 Sekunden zurückgegeben.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
kommt in weniger als einer Sekunde zurück. Was ist Ihre Definition von "langer Laufzeit" und wie verwenden Siefind
undlocate
?Antworten:
Suchen nach Quelldateien in einem Projekt
Verwenden Sie einen einfacheren Befehl
Im Allgemeinen befindet sich die Quelle für ein Projekt wahrscheinlich an einem Ort, möglicherweise in einigen wenigen Unterverzeichnissen, die nicht mehr als zwei oder drei Zeilen tief verschachtelt sind, sodass Sie einen (möglicherweise) schnelleren Befehl wie z
Nutzen Sie Projekt-Metadaten
In einem C-Projekt haben Sie normalerweise ein Makefile. In anderen Projekten haben Sie möglicherweise etwas Ähnliches. Dies kann ein schneller Weg sein, um eine Liste von Dateien (und ihren Speicherorten) zu extrahieren. Schreiben Sie ein Skript, das diese Informationen verwendet, um Dateien zu lokalisieren. Ich habe ein "Quellen" -Skript, damit ich Befehle wie schreiben kann
grep variable $(sources programname)
.Schneller finden
Suchen Sie nach weniger Orten, anstatt sie zu
find / …
verwenden,find /path/to/project …
wo dies möglich ist. Vereinfachen Sie die Auswahlkriterien so weit wie möglich. Verwenden Sie Pipelines, um einige Auswahlkriterien zu verschieben, wenn dies effizienter ist.Sie können auch die Suchtiefe begrenzen. Für mich bedeutet dies eine erhebliche Verbesserung der Suchgeschwindigkeit. Sie können den Schalter -maxdepth verwenden. Zum Beispiel '-maxtiefe 5'
Schnellere Lokalisierung
Stellen Sie sicher, dass die Standorte indiziert werden, an denen Sie interessiert sind. Lesen Sie die Manpage und nutzen Sie die für Ihre Aufgabe geeigneten Optionen.
Beseitigen Sie die Notwendigkeit der Suche
Vielleicht suchen Sie, weil Sie vergessen haben, wo etwas steht oder was nicht gesagt wurde. Im ersteren Fall schreiben Sie Notizen (Dokumentation), im letzteren fragen Sie? Konventionen, Standards und Konsistenz können sehr hilfreich sein.
quelle
Ich habe den Teil von RedGrittyBricks Antwort verwendet, der das Auffinden beschleunigt. Ich habe eine kleinere Datenbank erstellt:
dann darauf hingewiesen
locate
:locate -d /home/benhsu/ben.db
quelle
Eine Taktik, die ich benutze, besteht darin, die
-maxdepth
Option anzuwenden mitfind
:Wiederholen Sie dies mit zunehmender Tiefe, bis Sie das Gewünschte gefunden haben oder es müde wird, danach zu suchen. Die ersten paar Iterationen werden wahrscheinlich sofort zurückkehren.
Dies stellt sicher, dass Sie keine Zeit im Voraus mit dem Durchsuchen der Tiefen von massiven Teilbäumen verschwenden, wenn das, was Sie suchen, eher in der Nähe der Basis der Hierarchie liegt.
Hier ist ein Beispielskript zur Automatisierung dieses Prozesses (Strg-C, wenn Sie sehen, was Sie wollen):
Beachten Sie, dass die inhärente Redundanz (jeder Durchlauf muss die in den vorherigen Durchläufen verarbeiteten Ordner durchlaufen) durch das Zwischenspeichern von Datenträgern weitgehend optimiert wird.
Warum ist
find
diese Suchreihenfolge nicht als integrierte Funktion verfügbar? Vielleicht, weil die Implementierung kompliziert oder unmöglich wäre, wenn Sie davon ausgehen, dass die redundante Überquerung inakzeptabel ist. Die Existenz der-depth
Option deutet auf die Möglichkeit hin, aber leider ...quelle
Eine andere einfache Lösung ist die Verwendung von neuerem Extended Shell Globbing. Ermöglichen:
Anschließend können Sie im Quellverzeichnis der obersten Ebene folgende Befehle ausführen:
Dies hat den Vorteil, dass alle Unterverzeichnisse rekursiv durchsucht werden und dies sehr schnell geht.
quelle
Der silberne Sucher
Sie fanden es möglicherweise nützlich, wenn Sie den Inhalt einer großen Anzahl von Quellcodedateien sehr schnell durchsuchen möchten. Einfach tippen
ag <keyword>
. Hier einige meiner Ausgabenapt show silversearcher-ag
:Ich benutze es normalerweise mit:
quelle
.gitignore
Dateien und überspringt.git
,.svn
,.hg
.. Ordner..gitignore
und ignoriert standardmäßig auch versteckte und binäre Dateien. Haben Sie auch mehr Mitwirkende, mehr Sterne auf Github (14700 gegen 8300) und ist bereits auf Repos von Bürgermeister Distros. Bitte legen Sie einen aktualisierten, zuverlässigen Vergleich der Quellen von Drittanbietern vor. Trotzdemripgrep
sieht ein tolles Stück Software aus.ripgrep
in keiner Weise mit einem oder mehreren Autoren verbunden. Es passt einfach zu meinen Anforderungen und ich habe aufgehört, nach anderen Optionen zu suchen..gitignore
auch. Das heißt,rg
ist absolut erstaunlich. Zunächst einmal hat es Unicode-Unterstützung. Nach meiner Erfahrungrg
durchweg mindestens doppelt so schnell wieag
(YMMV), glaube ich, dass es an Rusts Regex-Parser liegt, der offensichtlich in den vergangenen Jahren noch nicht fertigag
war.rg
Kann deterministische Ausgaben liefern (aber nicht standardmäßig). Kann Dateitypen auf eine Blacklist setzen, bei denenag
nur eine Whitelist zulässig ist. Kann Dateien basierend auf der Größe ignorieren (Bye-Bye-Protokolle). Ich verwende immer nochag
für den Fall, dass ich mehrzeiliges Matching benötige, wasrg
nicht möglich ist.Für einen Ersatz finden Sie unter fd . Es hat eine einfachere / intuitivere Oberfläche als der ursprüngliche Befehl find und ist viel schneller.
quelle