Очень самоуверенная упрощенная команда Find, созданная с помощью Rust.
По умолчанию он ищет файл/папку в рабочем каталоге и делит результат на точные совпадения и совпадения, содержащие только запрос.
Результаты будут отсортированы в алфавитном порядке.
Например, hunt SomeFile /
выполнит поиск «SomeFile» в корневом каталоге, а результат может быть таким:
Contains:
/SomeFileIsHere
/home/lyon/Downloads/abcdefgSomeFileeee
/mnt/Files/--SomeFile--
Exact:
/home/lyon/SomeFile
Проверьте тесты для сравнения с другими инструментами.
hunt [OPTIONS] [NAME] [SEARCH_IN_DIRS]...
По умолчанию поиск осуществляется без учета регистра, если только [NAME]
не содержит заглавную букву или не установлен флаг --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
Если установлен флаг --first
, порядок поиска файла будет [current_dir, home_dir, root]
.
Если вы уже находитесь в одном из этих каталогов, current_dir
будет пропущен.
Если флаг --hidden
не установлен, скрытые файлы/каталоги будут пропущены.
[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
Поиск определенного файла во всей системе (поиск прекратится после обнаружения)
hunt -f -e SomeFile
Поиск файлов, содержащих «SomeFile»
hunt SomeFile
Поиск файла в домашнем каталоге
hunt -e SomeFile ~/
Поиск файла в каталогах загрузок и изображений.
hunt -e SomeFile ~/downloads ~/pictures
Искать все файлы, заканчивающиеся на «.exe».
hunt --ends .exe
Найдите все файлы, которые заканчиваются на «.exe» в каталоге Wine.
hunt --ends .exe ~/.wine
Искать все файлы, начинающиеся с "." (все скрытые файлы)
hunt --starts .
Найдите все файлы, которые заканчиваются на «.exe», начинаются с «M» и содержат «wind» в каталоге Wine.
hunt --starts=M --ends=.exe wind ~/.wine
Найдите каталог с именем «папка»
hunt -t=d folder
Найдите файл с именем «notfolder»
hunt -t=f notfolder
Удалите все файлы с именем «SomeFile».
hunt -s -e SomeFile | xargs rm -r
Обычно, когда я ищу файл, я не знаю точного подкаталога, в котором он находится, поэтому мне приходится искать по всему каталогу $HOME.
Использование для этого команды find
оказалось очень медленным, поскольку обход всех каталогов занимал много времени, а вывод также был трудночитаемым.
locate
работал быстрее, но не всегда находил нужный мне файл, так как искал только в своей базе данных, которая не обновляется в реальном времени.
Увидев, что find
вообще не выполняет никакого параллелизма, я решил сделать его многопоточную версию, и так родился Hunt.
Hunt является многопоточным, поэтому он намного быстрее, чем find
, и надежнее, locate
(последние файлы с его помощью невозможно найти).
Загрузите последнюю версию двоичного файла из выпусков.
Или установите с помощью cargo-binstall
:
cargo binstall hunt
Сначала проверьте, установлен ли у вас Rust, затем запустите
cargo install hunt
Давайте сравним Hunt с некоторыми наиболее часто используемыми инструментами: GNUlocate and find и очень популярным, также написанным на ржавчине, fd .
Для сравнительного анализа я использую Hyperfine, инструмент, разработанный разработчиком fd.
Это делается в системе с примерно 2 762 223 файлами, с сетевым диском и внешним.
Результаты на других системах могут отличаться, поэтому используйте это сравнение в качестве ориентира.
Если вы хотите воспроизвести тесты, вы можете сделать это, запустив файл benchmarks.sh
из этого репозитория.
Найдите первое появление сильно вложенного файла в скрытой папке домашнего каталога. Файл находится в папке /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, поиск по всем файлам (обычно он игнорирует скрытые файлы и каталоги в списке игнорирования).
--во-первых, остановиться, когда будет обнаружено первое вхождение.
--exact, искать только файлы/папки с именем «SomeFile», имена, содержащие только шаблон, будут пропущены.
Найдите все вхождения «SomeFile» в корневом каталоге (в худшем случае проверка всех файлов в системе).
Речь идет о следующих явлениях:
/home/lyon/Downloads/abcdefgSomeFileeee
/SomeFileIsHere
/mnt/Files/--SomeFile--
/home/lyon/.wine/drive_c/Program Files (x86)/Internet Explorer/SomeFile
В этом тесте я пропущу Locate. Очевидно, что это быстрее, поскольку не распространяется на всю файловую систему, поскольку резервная копия создается в базе данных.
Однако следует отметить, что файл в /mnt/Files не был найден, поскольку база данных не ведет учет файлов на других дисках.
Для любопытных: время составило 486,8 мс, всего в 1,32 раза быстрее, чем у Ханта.
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 работает быстрее, чем другие альтернативы, если вам не нужно много функций (например, регулярное выражение).
Думайте об этом как о простом вопросе: «Куда я положил этот файл?» решение.