34 个稳定版本
2.4.0 | 2024年5月22日 |
---|---|
2.3.0 | 2024年3月14日 |
2.1.0 | 2024年2月21日 |
2.0.0 | 2023年5月26日 |
1.5.4 | 2022年1月15日 |
在 文件系统 中排名第 58
每月下载量 321
125KB
611 行
用 Rust 制作的具有高度偏见的简化版 Find 命令。
默认情况下,它在工作目录中搜索文件/文件夹,并将结果分为精确匹配和只包含查询的结果。
结果将按字母顺序排序。
例如,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
标志,文件搜索的顺序为 [当前目录, 主目录, 根目录]
。
如果您已经位于这些目录之一中,则将跳过 当前目录
。
如果未设置 --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
-
在 wine 目录中搜索所有以 ".exe" 结尾的文件
hunt --ends .exe ~/.wine
-
搜索所有以 "." 开头的文件(所有隐藏文件)
hunt --starts .
-
在 wine 目录中搜索所有以 ".exe" 结尾、以 "M" 开头且包含 "wind" 的文件
hunt --starts=M --ends=.exe wind ~/.wine
-
搜索名为 "folder" 的目录
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
更可靠(不能用它找到最近的文件)。
安装
预编译的二进制文件
从发布版下载最新二进制文件。
从源代码编译
首先确保你已经安装了Rust,然后运行
cargo install hunt
基准测试
让我们比较Hunt和一些最常用的工具:GNU的locate和find,以及同样用Rust编写的非常流行的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'
Hunt
--hidden,搜索所有文件(它通常会忽略在忽略列表中的隐藏文件和目录)。
--first,找到第一个出现时停止。
--exact,只搜索名为"someFile"的文件/文件夹,只包含模式的名称将被跳过。
搜索所有包含"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毫秒,只比Hunt快1.32倍。
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
Fd
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
Find
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如果你不需要很多功能(比如正则表达式)的话,比其他替代品更快。
把它想成一个简单的“我把文件放在哪了?”的解决方案。
依赖关系
~7–19MB
~246K SLoC