Ein vielbeachteter vereinfachter Suchbefehl, der mit Rust erstellt wurde.
Standardmäßig durchsucht es eine Datei/einen Ordner im Arbeitsverzeichnis und unterteilt das Ergebnis in exakte Übereinstimmungen und solche, die nur die Abfrage enthalten.
Die Ergebnisse werden alphabetisch sortiert.
Beispielsweise sucht hunt SomeFile /
nach „SomeFile“ im Stammverzeichnis und die Ausgabe könnte wie folgt aussehen:
Contains:
/SomeFileIsHere
/home/lyon/Downloads/abcdefgSomeFileeee
/mnt/Files/--SomeFile--
Exact:
/home/lyon/SomeFile
Sehen Sie sich die Benchmarks an, um einen Vergleich mit anderen Tools zu erhalten.
hunt [OPTIONS] [NAME] [SEARCH_IN_DIRS]...
Standardmäßig wird bei Suchen die Groß-/Kleinschreibung nicht beachtet, es sei denn, [NAME]
enthält einen Großbuchstaben oder das Flag --case-sensitive
ist gesetzt.
-f, --first
Stop when first occurrence is found
-e, --exact
Only search for exactly matching occurrences, any file only containing the query will be skipped
e.g. if query is "SomeFile", "I'mSomeFile" will be skipped, as its name contains more letters than the search
-c, --canonicalize
If enabled, all paths will be canonicalized
-C, --case-sensitive
If enabled, the search will be case-sensitive
Note that case-sensitivity will be activated automatically when the search query contains an uppercase letter
-v, --verbose
Print verbose output
It'll show all errors found: e.g. "Could not read /proc/81261/map_files"
-s, --simple...
Prints without formatting (without "Contains:" and "Exact:")
-ss Output is not sorted
-H, --hidden
If enabled, it searches inside hidden directories
If not enabled, hidden directories will be skipped
--select
When the search is finished, choose one file between the results
The selected file will be printed as if -ss was used
--multiselect
When the search is finished, choose between the results
The selected files will be printed one after the other, separated by spaces
-S, --starts <STARTS_WITH>
Only files that start with this will be found
-E, --ends <ENDS_WITH>
Only files that end with this will be found
-t, --type <FILE_TYPE>
Specifies the type of the file
'f' -> file | 'd' -> directory
-i, --ignore <IGNORE_DIRS>
Ignores this directories. The format is:
-i dir1,dir2,dir3,...
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
Wenn das Flag --first
gesetzt ist, ist die Reihenfolge, in der die Datei durchsucht wird, [current_dir, home_dir, root]
.
Wenn Sie sich bereits in einem dieser Verzeichnisse befinden, wird current_dir
übersprungen.
Wenn das Flag --hidden
nicht gesetzt ist, werden versteckte Dateien/Verzeichnisse übersprungen.
[NAME] Name of the file/folder to search
By default, searches are case-insensitive, unless the query contains an uppercase letter.
[SEARCH_IN_DIRS]...
Directories where you want to search
If provided, hunt will only search there
These directories are treated independently, so if one is nested into another the
search will be done two times:
e.g. "hunt somefile /home/user /home/user/downloads" will search in the home
directory, and because /home/user/downloads is inside it, /downloads will be
traversed two times
Suche nach einer bestimmten Datei im gesamten System (die Suche stoppt, sobald sie gefunden wurde)
hunt -f -e SomeFile
Suchen Sie nach Dateien, die „SomeFile“ enthalten.
hunt SomeFile
Datei im Home-Verzeichnis durchsuchen
hunt -e SomeFile ~/
Suchen Sie nach Dateien in den Download- und Bildverzeichnissen
hunt -e SomeFile ~/downloads ~/pictures
Durchsuchen Sie alle Dateien, die mit „.exe“ enden.
hunt --ends .exe
Durchsuchen Sie alle Dateien im Wine-Verzeichnis, die mit „.exe“ enden
hunt --ends .exe ~/.wine
Durchsuchen Sie alle Dateien, die mit „.“ beginnen. (alle versteckten Dateien)
hunt --starts .
Durchsuchen Sie alle Dateien im Wine-Verzeichnis, die mit „.exe“ enden, mit „M“ beginnen und „wind“ enthalten
hunt --starts=M --ends=.exe wind ~/.wine
Durchsuchen Sie ein Verzeichnis mit dem Namen „Ordner“.
hunt -t=d folder
Suchen Sie nach einer Datei mit dem Namen „notfolder“
hunt -t=f notfolder
Entfernen Sie alle Dateien mit dem Namen „SomeFile“.
hunt -s -e SomeFile | xargs rm -r
Wenn ich nach einer Datei suche, kenne ich normalerweise nicht das genaue Unterverzeichnis, in dem sie sich befindet, sodass ich am Ende im gesamten $HOME-Verzeichnis suche.
Die Verwendung des Befehls find
hierfür war sehr langsam, da das Durchsuchen aller Verzeichnisse viel Zeit in Anspruch nahm und die Ausgabe auch schwer zu lesen war.
locate
war schneller, fand aber nicht immer die gesuchte Datei, da es nur in seiner Datenbank sucht, die nicht in Echtzeit aktualisiert wird.
Als ich sah, dass find
überhaupt keine Parallelität ausführte, beschloss ich, eine Multithread-Version davon zu erstellen, und so wurde Hunt geboren.
Hunt ist multithreaded und daher viel schneller als find
und zuverlässiger locate
(aktuelle Dateien können damit nicht gefunden werden).
Laden Sie die neueste Binärdatei von Releases herunter.
Oder mit cargo-binstall
installieren:
cargo binstall hunt
Überprüfen Sie zunächst, ob Rust installiert ist, und führen Sie es dann aus
cargo install hunt
Vergleichen wir Hunt mit einigen der am häufigsten verwendeten Tools: dem GNU -Locate- and -Find und dem sehr beliebten, ebenfalls in Rust geschriebenen fd .
Für das Benchmarking verwende ich Hyperfine, ein vom fd dev entwickeltes Tool.
Dies erfolgt in einem System mit ca. 2.762.223 Dateien, mit einem Netzlaufwerk und einem externen.
Die Ergebnisse auf anderen Systemen können variieren. Nehmen Sie diese Vergleiche daher als Richtlinie.
Wenn Sie die Benchmarks reproduzieren möchten, können Sie dies tun, indem Sie die Datei benchmarks.sh
aus diesem Repository ausführen.
Finden Sie das erste Vorkommen einer stark verschachtelten Datei in einem versteckten Ordner im Home-Verzeichnis. Die Datei befindet sich in /home/user/.wine/drive_c/users/user/AppData/Local/mygame/User Data/Crashpad/reports/SomeFile
.
Benchmark 1: hunt --hidden --first --exact SomeFile ~/
Time (mean ± σ): 180.2 ms ± 7.4 ms [User: 406.6 ms, System: 1135.9 ms]
Range (min … max): 167.2 ms … 198.5 ms 16 runs
Benchmark 2: fd --hidden --no-ignore --glob --color=never --max-results=1 SomeFile ~/
Time (mean ± σ): 913.6 ms ± 52.5 ms [User: 2584.8 ms, System: 4628.6 ms]
Range (min … max): 858.6 ms … 1018.6 ms 10 runs
Benchmark 3: find ~/ -name SomeFile -print -quit 2>/dev/null
Time (mean ± σ): 2.219 s ± 0.071 s [User: 0.587 s, System: 0.988 s]
Range (min … max): 2.160 s … 2.395 s 10 runs
Benchmark 4: locate -n 1 -A SomeFile
Time (mean ± σ): 1.244 s ± 0.015 s [User: 1.231 s, System: 0.010 s]
Range (min … max): 1.231 s … 1.281 s 10 runs
Summary
'hunt --hidden --first --exact SomeFile ~/' ran
5.07 ± 0.36 times faster than 'fd --hidden --no-ignore --glob --color=never --max-results=1 SomeFile ~/'
6.90 ± 0.30 times faster than 'locate -n 1 -A SomeFile'
12.31 ± 0.64 times faster than 'find ~/ -name SomeFile -print -quit 2>/dev/null'
--hidden, alle Dateien durchsuchen (normalerweise werden versteckte Dateien und Verzeichnisse in der Ignorierungsliste ignoriert).
--first, stoppt, wenn das erste Vorkommen gefunden wird.
--exact, sucht nur nach Dateien/Ordnern mit dem Namen „SomeFile“, Namen, die nur das Muster enthalten, werden übersprungen.
Finden Sie alle Vorkommen von „SomeFile“ im Stammverzeichnis (im schlimmsten Fall werden alle Dateien im System überprüft).
Es handelt sich um folgende Vorkommnisse:
/home/lyon/Downloads/abcdefgSomeFileeee
/SomeFileIsHere
/mnt/Files/--SomeFile--
/home/lyon/.wine/drive_c/Program Files (x86)/Internet Explorer/SomeFile
Für diesen Benchmark überspringe ich Locate. Es ist offensichtlich schneller, da es nicht das gesamte Dateisystem durchläuft, da es von einer Datenbank gesichert wird.
Es muss jedoch beachtet werden, dass die Datei in /mnt/Files nicht gefunden wurde, da die Datenbank keine Aufzeichnungen über Dateien auf anderen Laufwerken führt.
Für Neugierige: Es erreichte eine Zeit von 486,8 ms, nur 1,32-mal schneller als Hunt.
Benchmark 1: hunt -H SomeFile /
Time (mean ± σ): 633.6 ms ± 25.1 ms [User: 2876.7 ms, System: 2507.5 ms]
Range (min … max): 589.4 ms … 671.2 ms 10 runs
Benchmark 2: fd -HI -c never SomeFile /
Time (mean ± σ): 1.452 s ± 0.014 s [User: 4.116 s, System: 8.693 s]
Range (min … max): 1.431 s … 1.474 s 10 runs
Benchmark 3: find / -name "*SomeFile*"
Time (mean ± σ): 3.473 s ± 0.144 s [User: 1.234 s, System: 1.602 s]
Range (min … max): 3.374 s … 3.874 s 10 runs
'hunt -H SomeFile /' ran
2.29 ± 0.09 times faster than 'fd -HI -c never SomeFile /'
5.48 ± 0.31 times faster than 'find / -name "*SomeFile*"'
Hunt ist schneller als andere Alternativen, wenn Sie nicht viele Funktionen benötigen (wie Regex).
Betrachten Sie es als eine einfache Frage: „Wo habe ich diese Datei abgelegt?“ Lösung.