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, vielleicht in ein paar Unterverzeichnissen, die nicht mehr als zwei oder drei tief verschachtelt sind, sodass Sie einen (möglicherweise) schnelleren Befehl wie
verwenden können(cd /path/to/project; ls *.c */*.c */*/*.c)
Verwenden Sie Projektmetadaten
In einem C-Projekt haben Sie normalerweise ein Makefile. In anderen Projekten haben Sie vielleicht etwas Ähnliches. Dies kann eine schnelle Möglichkeit sein, eine Liste von Dateien (und ihren Speicherorten) zu extrahieren. Schreiben Sie ein Skript, das diese Informationen verwendet, um Dateien zu finden. Ich habe ein "Quellen"-Skript, damit ich Befehle wie grep variable $(sources programname)
schreiben kann .
Suche beschleunigen
Suchen Sie weniger Orte statt find / …
Verwenden Sie find /path/to/project …
wo möglich. Vereinfachen Sie die Auswahlkriterien so weit wie möglich. Verwenden Sie Pipelines, um einige Auswahlkriterien zu verschieben, wenn dies effizienter ist.
Außerdem können Sie die Suchtiefe einschränken. Für mich verbessert dies die Geschwindigkeit des "Findens" erheblich. Sie können den Schalter -maxdepth verwenden. Zum Beispiel '-maxdepth 5'
Suche beschleunigen
Stellen Sie sicher, dass die Orte, an denen Sie interessiert sind, indiziert werden. Lesen Sie die Manpage und nutzen Sie die für Ihre Aufgabe geeigneten Optionen.
-U <dir>
Create slocate database starting at path <dir>.
-d <path>
--database=<path> Specifies the path of databases to search in.
-l <level>
Security level. 0 turns security checks off. This will make
searchs faster. 1 turns security checks on. This is the
default.
Das Suchen entfällt
Vielleicht suchen Sie, weil Sie vergessen haben, wo etwas ist oder nicht gesagt wurde. Im ersteren Fall Notizen (Dokumentation) schreiben, im letzteren Fall fragen? Konventionen, Standards und Konsistenz können sehr hilfreich sein.
Ich habe den Teil "Beschleunigung der Ortung" von RedGrittyBricks Antwort verwendet. Ich habe eine kleinere Datenbank erstellt:
updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"
zeigt dann auf locate
dabei:locate -d /home/benhsu/ben.db
Eine Taktik, die ich verwende, ist die Anwendung des -maxdepth
Option mit find
:
find -maxdepth 1 -iname "*target*"
Wiederholen Sie dies mit zunehmender Tiefe, bis Sie finden, wonach Sie suchen, oder Sie des Suchens müde werden. Die ersten Iterationen werden wahrscheinlich sofort zurückgegeben.
Dadurch wird sichergestellt, dass Sie keine Zeit damit verschwenden, die Tiefen massiver Unterbäume zu durchsuchen, wenn das, wonach Sie suchen, eher in der Nähe der Basis der Hierarchie liegt.
Hier ist ein Beispielskript, um diesen Prozess zu automatisieren (Strg-C, wenn Sie sehen, was Sie wollen):
(
TARGET="*target*"
for i in $(seq 1 9) ; do
echo "=== search depth: $i"
find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)
Beachten Sie, dass die damit verbundene inhärente Redundanz (jeder Durchlauf muss die in den vorherigen Durchläufen verarbeiteten Ordner durchlaufen) weitgehend durch Festplatten-Caching wegoptimiert wird.
Warum nicht find
Haben Sie diese Suchreihenfolge als integrierte Funktion? Vielleicht, weil es kompliziert/unmöglich zu implementieren wäre, wenn Sie davon ausgehen, dass die redundante Traversierung nicht akzeptabel ist. Die Existenz von -depth
Option weist auf die Möglichkeit hin, aber leider...