Um comando Find simplificado e altamente opinativo feito com Rust.
Por padrão, ele pesquisa um arquivo/pasta no diretório de trabalho e divide o resultado entre correspondências exatas e aquelas que contêm apenas a consulta.
Os resultados serão classificados em ordem alfabética.
Por exemplo, hunt SomeFile /
pesquisará "SomeFile" no diretório raiz e a saída poderá ser:
Contains:
/SomeFileIsHere
/home/lyon/Downloads/abcdefgSomeFileeee
/mnt/Files/--SomeFile--
Exact:
/home/lyon/SomeFile
Verifique os Benchmarks para uma comparação com outras ferramentas.
hunt [OPTIONS] [NAME] [SEARCH_IN_DIRS]...
Por padrão, as pesquisas não diferenciam maiúsculas de minúsculas, a menos que [NAME]
contenha uma letra maiúscula ou o sinalizador --case-sensitive
esteja definido.
-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
Se o sinalizador --first
estiver definido, a ordem em que o arquivo será pesquisado será [current_dir, home_dir, root]
.
Se você já estiver em um desses diretórios, current_dir
será ignorado.
Se o sinalizador --hidden
não estiver definido, os arquivos/diretórios ocultos serão ignorados.
[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
Procure um arquivo específico em todo o sistema (a busca será interrompida assim que for encontrada)
hunt -f -e SomeFile
Procure por arquivos contendo "SomeFile"
hunt SomeFile
Pesquise o arquivo no diretório inicial
hunt -e SomeFile ~/
Pesquise o arquivo nos diretórios de downloads e imagens
hunt -e SomeFile ~/downloads ~/pictures
Pesquise todos os arquivos que terminam com “.exe”
hunt --ends .exe
Pesquise todos os arquivos que terminam com “.exe” no diretório wine
hunt --ends .exe ~/.wine
Pesquise todos os arquivos que começam com "." (todos os arquivos ocultos)
hunt --starts .
Pesquise todos os arquivos que terminam com “.exe”, comecem com “M” e contenham “wind” no diretório wine
hunt --starts=M --ends=.exe wind ~/.wine
Pesquise um diretório chamado "pasta"
hunt -t=d folder
Pesquise um arquivo chamado "notfolder"
hunt -t=f notfolder
Remova todos os arquivos chamados "SomeFile"
hunt -s -e SomeFile | xargs rm -r
Normalmente, quando procuro um arquivo, não sei o subdiretório exato onde ele está, então acabo pesquisando em todo o diretório $HOME.
Usar o comando find
para isso acabou sendo muito lento, pois demorava muito para percorrer todos os diretórios e a saída também era difícil de ler.
locate
foi mais rápido, mas nem sempre encontrou o arquivo que procurava, pois apenas pesquisa em seu banco de dados que não é atualizado em tempo real.
Vendo como find
não realizava nenhum paralelismo, decidi fazer uma versão multithreaded dele, e foi assim que Hunt nasceu.
Hunt é multithread, por isso é muito mais rápido que find
e mais confiável que locate
(arquivos recentes não podem ser encontrados com ele).
Baixe o binário mais recente dos lançamentos.
Ou instale com cargo-binstall
:
cargo binstall hunt
Primeiro verifique se você tem o Rust instalado e depois execute
cargo install hunt
Vamos comparar o Hunt com algumas das ferramentas mais usadas: o GNU localizar e localizar e o muito popular também escrito em ferrugem, fd .
Para benchmarking estou usando o hyperfine, uma ferramenta desenvolvida pelo fd dev.
Isso é feito em um sistema com aproximadamente 2.762.223 arquivos, com um drive de rede e outro externo.
Os resultados em outros sistemas podem variar, portanto, tome essas comparações como guia.
Se quiser reproduzir os benchmarks, você pode fazê-lo executando o arquivo benchmarks.sh
deste repositório.
Encontre a primeira ocorrência de um arquivo fortemente aninhado em uma pasta oculta do diretório inicial. O arquivo está localizado em /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, pesquisa todos os arquivos (normalmente ignora arquivos e diretórios ocultos na Lista de Ignorados).
--first, pare quando a primeira ocorrência for encontrada.
--exact, pesquise apenas arquivos/pastas chamados "SomeFile", nomes que contenham apenas o padrão serão ignorados.
Encontre todas as ocorrências de "SomeFile" no diretório raiz (na pior das hipóteses, verificando todos os arquivos no sistema).
As ocorrências em questão são:
/home/lyon/Downloads/abcdefgSomeFileeee
/SomeFileIsHere
/mnt/Files/--SomeFile--
/home/lyon/.wine/drive_c/Program Files (x86)/Internet Explorer/SomeFile
Para este benchmark, pularei o Locate. Obviamente é mais rápido porque não percorre todo o sistema de arquivos, pois é feito backup de um banco de dados.
Deve-se observar, porém, que o arquivo em /mnt/Files não foi encontrado, pois o banco de dados não mantém registro de arquivos em outras unidades.
Para os curiosos, marcou um tempo de 486,8 ms, apenas 1,32 vezes mais 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*"'
O Hunt é mais rápido que outras alternativas se você não precisar de muitos recursos (como regex).
Pense nisso como um simples "onde coloquei esse arquivo?" solução.