简体中文
跨平台文件系统索引器和搜索器,结合了find
、 locate
和Everything
的优点以及文件内容搜索。适用于 Linux、macOS 和 Windows。
倒排索引是plocate
背后的技术,它使搜索在接近恒定的时间内完成,在v0.4.0
及更高版本中实现。不幸的是v0.4
没有经过充分测试,目前发布的是v0.3.x
。此外,自述文件中的所有演示都是在v0.3.0
上完成的。对于文件通常小于 3M 的个人计算机来说,倒排索引并没有太大的区别。
内容搜索未编入索引。如果此存储库达到 512 颗星,则将建立索引文件内容索引,因此,如果该应用程序证明对您有用或您发现它有趣,请粉碎该星形按钮!
(更多相关信息请点击此处。)
本自述文件是关于 CLI 应用程序的。对于 GUI 前端,请参阅 SearchEverywhere。 (也很不稳定)
该项目自 2022 年 8 月开始工作,但由于存在无数 bug,直到 2023 年 4 月才发布。不过,即使在稳定版本( v0.3.x
)上,目前仍然可能存在无数错误。
唯一的运行时依赖项是 PCRE2,完全静态的可执行文件大小仅为 2.5MiB(已删除)。
macOS 和 Windows 上第一个 Libre 文件索引器!?
find
macOS Firmlink /System/Volumes/Data
分别在 macOS 和 Windows 上的屏幕截图:
updatedb
(仅限SSD)与locate
不同,重建文件系统索引不需要root权限(或Windows上的管理员权限)。也没有setugid。
对于SSD来说,为并发目录读取设置了线程池,大大加快了读取速度。
对于 HDD,应禁用此功能,因为多线程 IO 由于其旋转特性而不会带来明显的性能提升。
是否应启用多线程updatedb
可以按路径切换。
从图中可以看出,在cache drop的情况下, orient
可以在1秒内扫描810000个文件,但使用的磁盘是相当高端的磁盘。不过,请持保留态度。
与updatedb
一样,相同的线程池也用于内容匹配。当缓存被丢弃时,从 75000 个文件的 Linux 内核源代码树中模糊匹配hello world
需要 5.5 秒,而当缓存被丢弃时,则需要 1.5 秒。
(持保留态度;16x Intel i7 11800H 和 NVMe SSD)
在 Windows 上,内容匹配速度明显较慢,这是 UTF8 到 UTF16 转换、缺乏有效的内核内存映射 (
mmap(2)
) 以及 Windows 臃肿、低效本质的综合影响。
再见, find ... | xargs grep ...
并find ... -a -exec grep ...
find
的语法如下所示, orient
还实现了find
的大部分匹配功能,使用户能够轻松熟悉find
现有使用经验,同时也增加了应用程序的多功能性。
与仅将父级匹配硬编码为字符串匹配的Everything
不同,在orient
中, -updir -downdir
可以应用于任何谓词。
此外, -downdir
开销几乎为 0,而-updir
通过缓存最近的匹配项使搜索速度更快。
匹配父级:
匹配的孩子:
Linux | 视窗 | macOS | 安卓 | 执照 | |
---|---|---|---|---|---|
Everything | ?不 | ?是的 | ?不 | ?不 | 所有权 |
find | ?是的 | ?不 | ?不 | ?不 | GPLv3 |
fsearch | ?是的 | ?不 | ?不 | ?不 | GPLv2 |
locate | ?是的 | ?不 | ?不 | ?不 | GPLv3 |
orient | ?是的 | ?是的 | ?是的 | ?不 | GPLv3 |
续表
-and -or | 倒排索引 | 匹配家长 | 图形用户界面 | 命令行界面 | |
---|---|---|---|---|---|
Everything | ?是的 | ?不 | 部分的 | ?是的 | ? |
find | ?是的 | ?不 | ?不 | ?不 | ?是的 |
fsearch | ?是的 | ?不 | 部分的 | ?是的 | ?不 |
locate | ?不 | ?是的 | ?不 | ?不 | ?是的 |
orient | ?是的 | ?是的 | ?是的 | ?是的 | ?是的 |
笔记:
Everything
CLI 似乎所有结果都经过美化,使其很难与其他工具结合使用,因此?脸。eVeRyThInG
专有的,仅提供 SDK!我们亲爱的领袖理查德·斯托曼将会用核武器摧毁它!更糟糕的是,
Everything SDK
中充满了全局状态。?
find
的语法熟悉find
的用户可以立即使用orient
的find
兼容谓词,例如-regex
、 -lname
、 -okdir
等。
请注意, orient
谓词有时是其find
项的超集,例如-quit
可选择接受整数参数,这意味着在退出之前可以生成多少个结果。它的默认值为 1,因此当使用不带参数的-quit
时,它与find
中的没有区别。
对于特定于orient
谓词,仅提供orient
样式语法,请参见下文。
# mp3 or mp4 file excluding under hidden dirs
find ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
orient ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
# Ask user to whether to show its realpath when a symlink found in /usr
# until user inputs "yes" (realpath executes)
find /usr -type l -a -okdir realpath {} ; -a -quit
orient /usr -type l -a -okdir realpath {} ; -a -quit
# Until 2 user inputs "yes"
orient /usr -type l -a -okdir realpath {} ; -a -quit 2
# Even better, -quitmod
orient /usr -quitmod ( -type l -a -okdir realpath {} ; )
# -quit -quitmod has some quirks; see docs/predicates.md
orient
的替代语法orient
没有像find
那样多(唯一)谓词。相反, orient
使用-PRED --ARG
语法,为单个谓词提供多个匹配方案,从而提高代码的可重用性。
-name
-bregex
-strstr
-fuzz
--ignore-case
(除了-fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(fuzz 除外) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
或-
整数许多find
兼容谓词实际上是别名,例如-lname
与-name --readlink
相同-regex
- -bregex --ignore-case
( b
代表基本名称)
-samefile
基本上是-inode
因为-inode
也接受文件名
也可以将两种语法混合在一起,但不推荐
像-iname --full
或-anewer +5
下面是一些简单的例子。请在此处查看有关如何使用它们的更多信息。
# Find C source files containing "hello"; orient style only
orient / -content-strstr hello -name " *.c "
# Many `find` style predicates are actually aliases, ex:
orient / -iname " *.cpp " # find style
orient / -name --ignore-case " *.cpp " # orient style
# Assuming /home/a/b links to /var/tmp, then
# all the following 3 lines matches /home/a/b
# `-lname` is identical to `-name --readlink`
orient / -lname " *tmp "
orient / -name --readlink " *tmp "
# `orient` style is more versatile:
orient / -bregex --readlink ' tmp$ ' # No `find` style alternative
通过引入修饰谓词,可以在传播到其他 pred 之前“做某事”,这正是-updir
和-downdir
的作用:它们匹配文件的父级和目录的子级。
使用修饰符, -updir -downdir
可以应用于orient
中的任何谓词,这与硬编码父级匹配仅与字符串匹配的Everything
不同。
任何谓词都包括-updir -downdir
本身的递归使用。
此外, -downdir
开销几乎为 0,而-updir
通过缓存最近的匹配项使搜索速度更快。
更多修饰符包括-prunemod
、 -quitmod
和-not
。前任:
# Find bin/gcc*
orient / -updir -name " gcc* " -a -executable
# Find bin/gcc* or bin/clang*
orient / -updir ( -name " gcc* " -o -name " clang* " ) -a -executable
# Find git repositories, first level only
orient / -downdir ( -name .git -a -type d ) -a -prune
# Must use -exec test on find and is extremely slow
find .. -type d -a -exec test -d ' {}/.git ' ; -a -print -a -prune
# .cc files under src directory of a git repository
orient / -updir ( -name src -a -updir -downdir -name .git ) -name " *.cc "
由于该应用程序是 CLI,因此只需获取系统的可执行文件即可运行。
在 Linux 上,
-user -nouser -group -nogroup
需要 glibc 才能工作。
不幸的是,由于我没有这样的机器,所以缺少 macOS ARM 版本?请随意报告它是否适用于问题或讨论。
目前这个应用程序测试太少,无法发布到发行版。
顺便说一句,可能会首先发布到 Arch AUR。
建议在发布的早期阶段从源代码构建。试一试吧! ( v0.4.0
必需)
或者更好的是,同时构建orient
和 SearchEverywhere。通过构建SearchEverywhere
, orient
也随之构建起来。构建依赖关系:
除了CMake
之外,所有依赖项都可以由 CMake 自动下载。
如果您已经通过切换下面的这些配置选项将其中一些安装到您的系统上,那么也可以使用已安装的选项。
配置选项:
ORIE_TEST
:构建 GoogleTest 测试套件ORIE_SYSTEM_PCRE2
:使用系统 PCRE2 库而不是编译新的库。ORIE_LINK_STATIC
:静态链接定向可执行文件ORIE_SYSTEM_RAPIDFUZZ
:使用系统rapidfuzz库(仅限标头)将下面的OPTION
替换为您启用的选项,然后运行以下命令:
git clone https://github.com/cxxsucks/orient.git
cd orient ; mkdir build ; cd build
cmake -DOPTION1=ON -DOPTION2=ON -DCMAKE_BUILD_TYPE=Release ..
make -j $( nproc )
sudo make install
默认配置生成对一些起始点进行硬编码,并在所有起始点上启用多线程读取,这对于旋转硬盘来说不是最佳选择。
如果您碰巧使用 HDD,请在第一次运行orient
时执行以下操作:
orient -updatedb
Ctrl-C
立即中断~/.config/orie/default.txt
或%APPDATA%.oriedefault.txt
ROOT
之后的路径,如果这些路径中的任何一个实际上不在 SSD 上,则删除SSD
字段。ROOT "/path/to/mountpoint"
或干脆不使用IGNORED "/path/to/mountpoint"
对其进行索引。在 Linux 上, /sys/block/sda/queue/rotational
提供了有关磁盘是否可旋转的信息,不幸的是(但在意料之中)macOS 和 Windows 没有这一功能。
在未来的版本中,将从/etc/mtab
和/sys/.../rotational
获取根点,它们会在 Linux 和 macOS 上自动配置根路径。
苹果太酷了!他们的 Macbook 必须配备世界上最好的硬盘,而且绝对不是旋转的!
exec
系列谓词已在 Windows 上实现,但未经测试。
适量的软件工程经验会告诉我们,未经测试的功能即使不是彻底失败,也肯定会包含错误。
有许多未经测试的功能,Windows 上的exec
是功能列表中实际列出的唯一功能。
其他未测试的功能列在 TODO 列表中,但未列出功能列表,并附有未测试的原因。
find
功能主要是全局选项:
-context
(SELinux 上下文)-printf -fprintf -ls -fls
(格式打印)-newerXY
-mindepth
-maxdepth
-H -L -P
(全局选项后面的符号链接)-D
(调试选项)-O
(优化级别)
orient
有自己的优化器,类似于find -O3
-regextype
(硬编码PCRE2)-warn -nowarn
-d -depth
(深度优先搜索)
orient
只能根据索引进行搜索。但与find
不同,-delete
不受影响。
-files0-from
-mount -xdev -xautofs
(不下降到安装位置)-help -version
文档将成为近期工作的中心。
无论如何,在此存储库的 GitHub Issues Tracker 中仍然接受错误报告和功能请求。
有关详细信息,请参阅待办事项列表。
dirent
到 Windows 的端口这里对符号链接和(假)设备、套接字支持进行了大量修改,因此它直接放入源代码而不是模块中。