Un comando de búsqueda simplificado y muy comentado creado con Rust.
De forma predeterminada, busca un archivo/carpeta en el directorio de trabajo y divide el resultado entre coincidencias exactas y aquellas que solo contienen la consulta.
Los resultados se ordenarán alfabéticamente.
Por ejemplo, hunt SomeFile /
buscará "SomeFile" en el directorio raíz y el resultado podría ser:
Contains:
/SomeFileIsHere
/home/lyon/Downloads/abcdefgSomeFileeee
/mnt/Files/--SomeFile--
Exact:
/home/lyon/SomeFile
Consulte los puntos de referencia para compararlos con otras herramientas.
hunt [OPTIONS] [NAME] [SEARCH_IN_DIRS]...
De forma predeterminada, las búsquedas no distinguen entre mayúsculas y minúsculas, a menos que [NAME]
contenga una letra mayúscula o esté configurado el indicador --case-sensitive
.
-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
Si se establece el indicador --first
, el orden en el que se buscará el archivo es [current_dir, home_dir, root]
.
Si ya se encuentra en uno de estos directorios, se omitirá current_dir
.
Si el indicador --hidden
no está configurado, se omitirán los archivos/directorios ocultos.
[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
Busque un archivo específico en todo el sistema (la búsqueda se detendrá una vez encontrado)
hunt -f -e SomeFile
Busque archivos que contengan "SomeFile"
hunt SomeFile
Buscar archivo en el directorio de inicio
hunt -e SomeFile ~/
Buscar archivos en los directorios de descargas e imágenes.
hunt -e SomeFile ~/downloads ~/pictures
Busque todos los archivos que terminen en ".exe"
hunt --ends .exe
Busque todos los archivos que terminen con ".exe" en el directorio Wine
hunt --ends .exe ~/.wine
Busque todos los archivos que comiencen con "." (todos los archivos ocultos)
hunt --starts .
Busque todos los archivos que terminen con ".exe", comiencen con "M" y contengan "wind" en el directorio Wine
hunt --starts=M --ends=.exe wind ~/.wine
Busque un directorio llamado "carpeta"
hunt -t=d folder
Busque un archivo llamado "notfolder"
hunt -t=f notfolder
Eliminar todos los archivos llamados "SomeFile"
hunt -s -e SomeFile | xargs rm -r
Normalmente, cuando busco un archivo, no sé el subdirectorio exacto donde está, por lo que termino buscando en todo el directorio $HOME.
Usar el comando find
para esto terminó siendo muy lento, ya que tomó mucho tiempo recorrer todos los directorios y el resultado también fue difícil de leer.
locate
era más rápido, pero no siempre encontraba el archivo que buscaba, ya que sólo busca en su base de datos que no se actualiza en tiempo real.
Al ver que find
no realizaba ningún paralelismo en absoluto, decidí hacer una versión multiproceso y así nació Hunt.
Hunt es multiproceso, por lo que es mucho más rápido que find
y más confiable que locate
(no se pueden encontrar archivos recientes con él).
Descargue el binario más reciente de las versiones.
O instalar con cargo-binstall
:
cargo binstall hunt
Primero verifique que tenga Rust instalado, luego ejecute
cargo install hunt
Comparemos Hunt con algunas de las herramientas más utilizadas: GNU localizar y buscar y la muy popular también escrita en óxido, fd .
Para la evaluación comparativa estoy usando Hyperfine, una herramienta desarrollada por fd dev.
Estos se realizan en un sistema con aproximadamente 2.762.223 archivos, con una unidad de red y otra externa.
Los resultados en otros sistemas pueden variar, así que tome estas comparaciones como guía.
Si desea reproducir los puntos de referencia, puede hacerlo ejecutando el archivo benchmarks.sh
desde este repositorio.
Encuentre la primera aparición de un archivo muy anidado en una carpeta oculta del directorio de inicio. El archivo se encuentra en /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, busca todos los archivos (normalmente ignora los archivos y directorios ocultos en la Lista de ignorados).
--primero, detenerse cuando se encuentre la primera aparición.
--exacto, solo busque archivos/carpetas llamados "SomeFile", se omitirán los nombres que solo contengan el patrón.
Encuentre todas las apariciones de "SomeFile" en el directorio raíz (en el peor de los casos, verifique todos los archivos en el sistema).
Los sucesos en cuestión son:
/home/lyon/Downloads/abcdefgSomeFileeee
/SomeFileIsHere
/mnt/Files/--SomeFile--
/home/lyon/.wine/drive_c/Program Files (x86)/Internet Explorer/SomeFile
Para este punto de referencia omitiré Localizar. Obviamente es más rápido porque no atraviesa todo el sistema de archivos, ya que está respaldado por una base de datos.
Sin embargo, debe tenerse en cuenta que no se encontró el archivo en /mnt/Files, ya que la base de datos no mantiene registros de los archivos en otras unidades.
Para los curiosos, marcó un tiempo de 486,8 ms, sólo 1,32 veces más rápido que 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 es más rápido que otras alternativas si no necesitas muchas funciones (como expresiones regulares).
Piense en ello como un simple "¿dónde puse ese archivo?" solución.