Une commande de recherche simplifiée très avisée réalisée avec Rust.
Par défaut, il recherche un fichier/dossier dans le répertoire de travail et divise le résultat entre les correspondances exactes et celles qui contiennent uniquement la requête.
Les résultats seront triés par ordre alphabétique.
Par exemple, hunt SomeFile /
recherchera "SomeFile" dans le répertoire racine et le résultat pourrait être :
Contains:
/SomeFileIsHere
/home/lyon/Downloads/abcdefgSomeFileeee
/mnt/Files/--SomeFile--
Exact:
/home/lyon/SomeFile
Consultez les benchmarks pour une comparaison avec d’autres outils.
hunt [OPTIONS] [NAME] [SEARCH_IN_DIRS]...
Par défaut, les recherches ne sont pas sensibles à la casse, sauf si [NAME]
contient une lettre majuscule ou si l'indicateur --case-sensitive
est défini.
-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 l'indicateur --first
est défini, l'ordre dans lequel le fichier sera recherché est [current_dir, home_dir, root]
.
Si vous êtes déjà dans l'un de ces répertoires, current_dir
sera ignoré.
Si l'indicateur --hidden
n'est pas défini, les fichiers/répertoires cachés seront ignorés.
[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
Rechercher un fichier spécifique sur l'ensemble du système (la recherche s'arrêtera une fois trouvé)
hunt -f -e SomeFile
Rechercher des fichiers contenant "SomeFile"
hunt SomeFile
Rechercher un fichier dans le répertoire personnel
hunt -e SomeFile ~/
Rechercher le fichier dans les répertoires de téléchargements et d'images
hunt -e SomeFile ~/downloads ~/pictures
Rechercher tous les fichiers se terminant par ".exe"
hunt --ends .exe
Rechercher tous les fichiers se terminant par ".exe" dans le répertoire wine
hunt --ends .exe ~/.wine
Recherchez tous les fichiers commençant par "." (tous les fichiers cachés)
hunt --starts .
Recherchez tous les fichiers se terminant par ".exe", commençant par "M" et contenant "wind" dans le répertoire wine
hunt --starts=M --ends=.exe wind ~/.wine
Rechercher un répertoire nommé "dossier"
hunt -t=d folder
Rechercher un fichier nommé "notfolder"
hunt -t=f notfolder
Supprimez tous les fichiers nommés "SomeFile"
hunt -s -e SomeFile | xargs rm -r
Normalement, lorsque je recherche un fichier, je ne connais pas le sous-répertoire exact où il se trouve, donc je finis par chercher dans tout le répertoire $HOME.
L'utilisation de la commande find
pour cela s'est avérée très lente, car il fallait beaucoup de temps pour parcourir tous les répertoires et le résultat était également difficile à lire.
locate
était plus rapide, mais il ne trouvait pas toujours le fichier que je cherchais, car il ne cherchait que dans sa base de données qui n'était pas mise à jour en temps réel.
Voyant que find
n'effectuait aucun parallélisme, j'ai décidé d'en faire une version multithread, et c'est ainsi qu'est né Hunt.
Hunt est multithread, il est donc beaucoup plus rapide que find
et plus fiable que locate
(les fichiers récents ne peuvent pas être trouvés avec).
Téléchargez le dernier binaire à partir des versions.
Ou installez avec cargo-binstall
:
cargo binstall hunt
Vérifiez d’abord que Rust est installé, puis exécutez
cargo install hunt
Comparons Hunt avec certains des outils les plus utilisés : le GNU Locate and Find et le très populaire également écrit en rust, fd .
Pour le benchmarking, j'utilise hyperfine, un outil développé par fd dev.
Celles-ci sont effectuées dans un système contenant environ 2 762 223 fichiers, avec un lecteur réseau et un lecteur externe.
Les résultats sur d’autres systèmes peuvent varier, alors prenez ces comparaisons comme guide.
Si vous souhaitez reproduire les benchmarks, vous pouvez le faire en exécutant le fichier benchmarks.sh
depuis ce référentiel.
Recherchez la première occurrence d'un fichier fortement imbriqué dans un dossier caché du répertoire personnel. Le fichier se trouve dans /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, recherche tous les fichiers (il ignore normalement les fichiers et répertoires cachés dans la liste des ignorés).
--first, s'arrête lorsque la première occurrence est trouvée.
--exact, recherche uniquement les fichiers/dossiers nommés "SomeFile", les noms qui contiennent uniquement le modèle seront ignorés.
Recherchez toutes les occurrences de "SomeFile" dans le répertoire racine (dans le pire des cas, vérification de tous les fichiers du système).
Les événements en question sont :
/home/lyon/Downloads/abcdefgSomeFileeee
/SomeFileIsHere
/mnt/Files/--SomeFile--
/home/lyon/.wine/drive_c/Program Files (x86)/Internet Explorer/SomeFile
Pour ce benchmark, je vais ignorer Localiser. C'est évidemment plus rapide car il ne traverse pas tout le système de fichiers, car il est sauvegardé par une base de données.
Il convient cependant de noter que le fichier dans /mnt/Files n'a pas été trouvé, car la base de données ne conserve pas d'enregistrement des fichiers sur d'autres lecteurs.
Pour les curieux, il a réalisé un temps de 486,8 ms, soit seulement 1,32 fois plus rapide 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 est plus rapide que les autres alternatives si vous n'avez pas besoin de beaucoup de fonctionnalités (comme les expressions régulières).
Considérez-le comme un simple « où ai-je mis ce fichier ? » solution.