#search-file #root-directory #find #algorithm #locate #name

app hunt

简单的命令,快速按名称搜索文件/文件夹

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

Download history 105/week @ 2024-05-18 15/week @ 2024-05-25 3/week @ 2024-06-01 7/week @ 2024-06-08 2/week @ 2024-06-15 319/week @ 2024-07-27 2/week @ 2024-08-03

每月下载量 321

MIT 许可证

125KB
611

Crates.io
用 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的locatefind,以及同样用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