题记与说明
横纵综合报告 · 成文日期:2026-10-29 · 定稿
本报告由同一课题的两份章节综合而成:纵轴(历时发展脉络)与横轴(2026-10-29 时间截面横向对比)。
方法声明:两份章节的全部关键事实均于 2026-10-29 核实——纵轴经由 GitHub Releases REST API 逐版本抓取、官方仓库 README / CHANGELOG / Cargo.toml 原文(raw.githubusercontent.com)、作者博客(burntsushi.net)、VS Code 官方更新日志与 docs.rs crate 文档;横轴在同日进行了 Windows 11 本机实测(Git Bash 计时)。本综合报告如实转引上述两章的核实结论与实测数据,并消除了两章之间的矛盾(裁决记录存档于附录 A)。所有来源链接均已保留。
TL;DR
终端工具链的现代替代浪潮分三波推进:ack / The Silver Searcher 确立"尊重版本控制忽略规则"的新默认(2005–2013);ripgrep / fd / bat 借 Rust 1.0 之后的生态把"线性时间正则自动机 + SIMD 预筛 + 无锁并行遍历 + 默认缩小搜索域"变成可复制的性能工程模板(2016–2019);zoxide 与 Windows 基建补齐最后一块(2020–2023)。2026 年时间截面上:ripgrep 与 fd 在真实负载下比传统对照快约 2–11 倍(本机实测 rg ≈2.0× vs ugrep、≈7.5× vs GNU grep、≈5.6–9.8× vs findstr,fd ≈10.8× vs find;对照口径与两次测量的差异说明见 §2.6),量级与公开基准一致;bat 是唯一比传统工具慢的替代品(0.18s vs 0.10s),卖点是可读性而非吞吐;zoxide 赢在人机交互时间而非毫秒数。四件套均已进入低迭代、高稳定期,性能从卖点变成基线,竞争焦点转向兼容性与生态胶水角色。建议:交互场景全面替换,脚本与 CI 保留 POSIX 工具;Windows 用户先做 Defender 进程排除、避开 winget 的 PATH 坑。
一、纵轴:发展脉络(1973–2026)
1.1 时间线速览
| 时间 | 事件 | 参与者 |
|---|---|---|
| 1973–74 | grep 诞生于 ed 编辑器的 g/re/p 命令,首见于 Unix 第 4 版 | Ken Thompson(Bell Labs) |
| 2005 前后 | ack 1.x 发布,口号 "better than grep" | Andy Lester |
| 2008–2009 | autojump(2008–09)→ z.sh(2009,GitHub 仓库创建于 2009-06-25,API 核实),frecency 跳目录思路成型 | Joel Schaerer、rupa |
| 2011-12-27 | The Silver Searcher(ag)发布,比 ack 快 3–10 倍 | Geoff Greer |
| 2013-10-23 | fzf 仓库创建,模糊搜索交互层出现 | junegunn |
| 2015-05-15 | Rust 1.0 发布,为下一波工具提供语言底座 | Rust 团队 |
| 2016-09-23 | 博客《ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}》发布 | Andrew Gallant(BurntSushi) |
| 2016-09-26 | ripgrep 0.2.0(官方 CHANGELOG 起点) | 同上 |
| 2017-03 | VS Code 1.11 将工作区搜索切换为 ripgrep 后端 | Microsoft |
| 2017-05/06 | fd 0.1.0(05-12)→ 1.0.0(06-05) | David Peter(sharkdp) |
| 2018-04-22 | bat 0.1.0 发布 | David Peter |
| 2018-09-07 | ripgrep 0.10.0:首个基于 libripgrep 的版本(PCRE2 / 多行 / JSON) | Andrew Gallant |
| 2019-04-15 | ripgrep 11.0.0(版本序列自 0.10 直接跳至 11) | 同上 |
| 2020-03-05 | zoxide 0.1.0 发布 | Ajeet D'Souza |
| 2020-05-19 | Windows Terminal 1.0 GA;winget 随后 GA(2021-05) | Microsoft |
| 2024-05-06 | fd 10.0.0(--hidden 与 .git 语义破坏性调整) | David Peter |
| 2025-10-15 | ripgrep 15.0.0(官方定位:"mostly bug fixes + minor performance improvements") | Andrew Gallant |
| 2025-12-02 | bat 0.26.1 发布(四件套中最后一个大版本,早于其余三者约半年) | David Peter |
| 2026-07/08 | 四件套最新版:rg 15.2.0(07-15)、zoxide 0.10.0(07-04)、fd 10.5.0(08-26) | 各自维护者 |
1.2 阶段〇(1969–2004):经典工具的四十年与它的天花板
grep 由 Ken Thompson 从 ed编辑器的 g/re/p(global/regular expression/print)命令中抽出,1973–74 年首见于 Unix 第 4 版,被 McIlroy 称为"原型软件工具"(Wikipedia: grep、Princeton CS333: ed to grep)。find、cat、cd 与其同龄,1980 年代中后期 GNU 项目重写了 grep 与 findutils,使它们成为 Linux 世界的事实标准。
这一代工具的设计假设是:单核 CPU、小磁盘、无版本控制、POSIX 可移植性至上。四十年后这些假设全部翻转——代码库以 GB 计、每个仓库都有 .gitignore、机器有 8–32 个核心——但 grep/find 的架构基本未变:单线程遍历、不懂版本控制忽略规则、find -name "*.log" -exec rm {} \; 式的晦涩语法。痛点清单在 2000 年代中期已经写好:grep 递归搜代码太慢且搜出无关文件;find 语法门槛高;cat 无高亮;cd 全靠手敲绝对路径。
1.3 阶段一(2005–2013):第一波替代浪潮——ack、ag 与跳目录前传
2005 年前后,Andy Lester 发布 ack(Perl 编写,beyondgrep.com),确立了两条沿用至今的新默认:按文件类型搜索(ack --type perl)、默认跳过版本控制目录与二进制文件。但 Perl 解释器的启动与执行开销封死了它的性能上限。
2008–2009 年,目录跳转工具成型:Joel Schaerer 的 autojump(2008–2009,wting/autojump)记录用户访问过的目录并按 frecency(频率 × 新近度)排序;rupa 的 z.sh(2009;GitHub 仓库 rupa/z 创建于 2009-06-25,Releases API 核实)把它简化为一个 POSIX shell 脚本。这条谱系是 zoxide 的直系前传。
2011-12-27,Geoff Greer 用 C 发布 The Silver Searcher(ag):Red Hat 打包评审原文称其"比 ack 快 3–5 倍"(Bugzilla #1008063),二手文献记载为快 5–10 倍(The Unix Namespace Is the Index)。2013 年前后 Go 生态加入:The Platinum Searcher(pt)与 sift 相继出现;junegunn 的 fzf(仓库创建于 2013-10-23,GitHub API)则为这套工具提供了后来无处不在的模糊交互层。
驱动因素:代码库规模膨胀与 .gitignore 普及让"聪明默认"成为刚需;脚本语言方便但慢,社区于是用 C/Go 重写换 3–10 倍速度。局限:ag 依赖 PCRE 回溯引擎,最坏情况复杂度不受控;这批工具都没有认真对待 Windows——为下一波留出了空间。
1.4 阶段二(2016–2019):Rust 时代来临与 ripgrep 的"基准测试革命"
2015-05-15,Rust 1.0 发布(官方博客)。C 级性能 + 内存安全 + cargo 生态,让"重写一遍 CLI 工具"第一次成为有利可图的工程决策。
2016-09-23,Andrew Gallant(网名 BurntSushi,Rust regex crate 作者)发表博客 《ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}》,以 OpenSubtitles2016 语料公开了可复现基准,ripgrep 在全部对照组上领先。三天后(2016-09-26)官方 CHANGELOG 的首个版本 ripgrep 0.2.0 发布(CHANGELOG;早期 0.1.x 与 0.2.x 双分支并行,GitHub Releases 上可见 0.1.18 发布于 2016-10-30)。这篇博客确立了一个新的行业惯例:替代品必须自带公开、可复现、含对照组的基准测试。
2017 年 3 月,VS Code 1.11 将全局工作区搜索切换为 ripgrep 后端(官方更新日志)——现代替代品第一次被重量级产品内嵌,用户基数从 CLI 爱好者跃迁到千万级编辑器用户。
David Peter(sharkdp)以"一人一年两个工具"的节奏补齐拼图:fd 0.1.0 于 2017-05-12、1.0.0 于 2017-06-05 发布(GitHub Releases);bat 0.1.0 于 2018-04-22 发布。关键在于工程复用:fd 的 Cargo.toml 直接依赖 ignore 与 regex crate(当前版本 ignore = "0.4.28"、regex = "1.12.2",见 fd/Cargo.toml)——fd 天生继承 ripgrep 的并行遍历与正则引擎,性能工程一次投入、全家桶多次摊销,这是第二波浪潮区别于第一波的结构性优势。
2018-09-07,ripgrep 0.10.0 发布:首个基于 libripgrep 的版本——核心搜索与打印代码被库化并重构,新增 PCRE2 支持、多行搜索与 JSON 输出(CHANGELOG)。此后版本序列从 0.10 直接跳至 11.0.0(2019-04-15)。值得记录的一个反直觉发现:官方渠道并无 ripgrep 1.0.0——GitHub API 对 releases/tags/1.0.0 与 git/refs/tags/1.0.0 均返回 404,CHANGELOG 亦无 1.0.0 标题;社区叙事中常提到的"ripgrep 1.0"无法在官方发布渠道得到证实。
1.5 阶段三(2020–2023):Windows 成为一级平台,全家桶固化
2020-03-05,Ajeet D'Souza 发布 zoxide 0.1.0(GitHub Releases)——用 Rust 重写"更聪明的 cd",README 明确支持 macOS/Linux/Windows,数据存于 %LOCALAPPDATA%\zoxide。谱系上它承接 autojump(2008–09)→ z.sh(2009,rupa/z 仓库创建于 2009-06-25,API 核实)→ fasd(2011,clvv/fasd 仓库创建于 2011-12-08,API 核实),把 frecency 匹配从 shell 脚本/Python 解释器搬进了编译型单二进制。至此,grep→rg、find→fd、cat→bat、cd→zoxide 四条替换线全部就位。
同年 Windows 终端基建三件套就位:Windows Terminal 1.0 于 2020-05-19 GA(microsoft/terminal);winget 在 Build 2020 预览、2021 年 5 月 GA(microsoft/winget-cli);更早的 scoop(GitHub 仓库 ScoopInstaller/Scoop 创建于 2013-05-11,API 核实)已在 CLI 社区流行。四个工具均提供 Windows 原生 exe,安装从此一条命令(ripgrep README 原文:"Windows binaries are static executables"——该"静态"表述出自 rg 的 README,仅覆盖 rg 本身;fd / bat / zoxide 的 Windows exe 均经各自官方 GitHub Releases 与 winget 渠道分发,本机 winget list 验证四包在列)。
版本节点(均经 GitHub Releases API 核实):rg 12.0.0(2020-03-16)→ 13.0.0(2021-06-12)→ 14.0.0(2023-11-26);fd 8.0.0(2020-04-16)→ 9.0.0(2023-12-19);bat 0.13.0(2020-03-22)→ 0.23.0(2023-03-25)→ 0.24.0(2023-10-11);zoxide 0.5.0(2020-10-30)→ 0.7.0(2021-05-02)。
1.6 阶段四(2024–2026):成熟期——性能从卖点变成基线
截至 2026-10-29,四个项目的最新版本与演进脉络(GitHub Releases API 核实):
- ripgrep:14.1.0(2024-01-06)→ 14.1.1(2024-09-09)→ 15.0.0(2025-10-15) → 15.1.0(2025-10-22)→ 15.2.0(2026-07-15,最新)。15.0.0 官方措辞耐人寻味:"mostly has bug fixes, some minor performance improvements"(release notes)——速度不再是发布公告的主角。
- fd:10.0.0(2024-05-06) 有一处破坏性调整(
--hidden下不再自动忽略.git,见 release notes)→ 10.3.0(2025-08-26)→ 10.4.0 / 10.4.1 / 10.4.2(2026-03-07 / 03-08 / 03-10)→ 10.5.0(2026-08-26,最新)。注:10.3.0 与 10.5.0 恰好同为 08-26 发布,GitHub Releases API 复核证实两日期均无误、并非笔误。 - bat:0.25.0(2025-01-07)→ 0.26.0(2025-10-19)→ 0.26.1(2025-12-02,最新)。
- zoxide:0.9.6(2024-09-19)→ 0.9.9(2026-01-31)→ 0.10.0(2026-07-04,最新),新增从 atuin 导入、非 Cygwin POSIX 环境(BusyBox 等)支持与
$CDPATH兼容(GitHub Releases)。
这一阶段的特征:个人/小团队维护者主导的"慢但稳"节奏;破坏性改动极其克制(fd CHANGELOG 全文仅三条 Breaking 变更:v8.6.0 的 Unix 专属 --type executable 语义收紧;v9.0.0 起 --hidden 默认忽略 .git、v10.0.0 又将其回退——一来一回,默认语义净变化为零,见 fd CHANGELOG);生态角色从"独立工具"扩展为"AI 编码工具与编辑器的搜索后端"——自 2017 年被 VS Code 内嵌之后,"内置 rg 当搜索引擎"已成为编辑器与智能编码工具的常见架构选择。
二、横轴:横向对比(2026-10 时间截面)
2.1 四组新旧对照总表
| 维度 | grep → ripgrep | find → fd | cat → bat | z/autojump/fasd → zoxide |
|---|---|---|---|---|
| 当前版本 | ripgrep 15.2.0(本机 15.1.0) | fd 10.5.0 | bat 0.26.1 | zoxide 0.10.0 |
| 语言 | C → Rust | C → Rust | —(cat 是 coreutils C)→ Rust | Shell/Python → Rust |
| 能力覆盖 | rg 覆盖绝大多数日常搜索场景,但 PCRE 回溯特性需 -P;多文件 sed/awk 管道仍属 grep 世界 | find 的 -mtime -size -perm -exec 属性表达式语言 fd 不具备;日常文件名查找的绝大多数场景可覆盖 | bat 只做"看",不做"流式处理";管道场景必须 cat | zoxide 只管目录;fasd 还能跳文件/程序(功能更多但更慢) |
| 性能来源 | 多线程 + Chase-Lev 无锁工作窃取队列;线性时间正则自动机;字面量提取 + memchr + Teddy SIMD | ignore crate 多线程遍历 | 不以快为目标(syntect 高亮有成本) | 预维护的 frecency 数据库 + O(n) 模糊评分 |
| 许可证/成本 | MIT(rg)/ GPL(grep),均免费 | MIT / GPL | MIT/Apache-2.0 / GPL | MIT / GPL |
| 生态 | VS Code 内置、RIPGREP_CONFIG_PATH 持久配置 | fzf 天然搭档;fd -x 批量执行 | delta/fzf/fd 输出互相喂;linter 管道 | 全主流 shell 钩子:bash/zsh/fish/Nushell/PowerShell/Tcsh/POSIX |
| 成熟度 | 2016 年首发,15.x 稳定线 | 2017 年首发,10.x 稳定线 | 2018 年首发,0.26.x | 2020 年首发(GitHub Releases API 核实为 2020-03-05),0.10.x |
| Windows | 一等公民(MSVC/GNU 双工具链) | 一等公民 | 一等公民(含 PS 5.1 补全修复) | 一等公民(0.10.0 新增非 Cygwin POSIX 环境) |
| 本机实测"快多少" | ≈2.0× vs ugrep、≈7.5× vs GNU grep;≈5.6–9.8× vs findstr | ≈10.8× vs find | ⚠️ 反例:0.18s vs cat 0.10s,更慢 | 秒级 vs 秒级,胜在无感 |
同运动的周边竞品横截面(2026-10):内容搜索类中 ugrep(C++,PCRE/AVX 优化)在特定负载可比 rg 快、功能是超集但社区规模远小(rg 官方讨论 #2597);ag 基本停更,在 rg 基准中慢约 4–8 倍(burntsushi.net/ripgrep);git grep 单文件/简单模式仍有竞争力,复杂模式与 Unicode 场景落后一个量级。文件查找类中 fzf 与 fd 互补(fd 枚举、fzf 交互筛选,fd | fzf 是标准玩法);Windows 专属的 Everything(voidtools)基于 NTFS 索引冷启动查询更快,但不处理内容。目录跳转类中 zsh-z 是 z.sh 的 zsh 移植(无二进制开销也无模糊匹配),autojump 已停更(LibHunt 对比)。同属"Rust 重写运动"的 eza / lsd / dust / procs / sd 替代价值相对弱(Rust CLI 全景清单:sts10 gist、zaiste、deepu);hyperfine 则是测"谁更快"的标准工具(Git Bash 下的使用注意见 §3.3 ②)。
2.2 ripgrep vs GNU grep / findstr:搜索品类已完成代际更换
能力:ripgrep 递归遍历、默认遵守 .gitignore/隐藏文件、默认多线程、原生 Unicode、彩色输出、-t <type> 按语言过滤、--json 输出模式、PCRE2 可选。GNU grep 仍是 POSIX 文本处理管道(grep | awk | sort)的基石,且 -P 的回溯语义是 rg 需要显式开启的特性——rg 的默认正则引擎拒绝无界回溯以保线性时间。
为什么快(两章原理合并;事实均出自作者基准长文 burntsushi.net/ripgrep 与官方 crate 文档):
- 线性时间正则引擎。Rust
regexcrate 文档明确写道 "linear time matching on all inputs"(docs.rs/regex):模式编译为有限自动机(含 lazy DFA),匹配时间对任何输入都有 O(文本 × 模式) 上界,杜绝 PCRE 类灾难性回溯;UTF-8 解码被编译进自动机本身——作者基准中 git grep 开 Unicode 后从约 1s 恶化到 13.045s,rg 保持约 0.355s。对照:ag 用的 PCRE 是回溯引擎,病态模式最坏指数级;GNU grep 的 DFA 很快但-P模式同样是回溯。 - SIMD 字节级预筛与字面量优化。memchr crate 利用 SIMD 指令集("SIMD on x86_64, aarch64 and wasm32",docs.rs/memchr)极速跳过不可能区域;rg 自动提取模式中的必要字面量,用"最稀有字节"策略驱动预筛(俄语字幕字面量基准:rg 0.325s vs 依赖常见字节扫描的 sift/pt 12.9–16.4s);多模式备选走源自 Intel Hyperscan 的 Teddy SIMD 算法(大小写不敏感交替模式:rg 0.222s vs git grep 2.018s)。
- 无锁并行目录遍历与搜索。ripgrep README 原文:"It uses a lock-free parallel recursive directory iterator, courtesy of the ignore crate"(ripgrep README;docs.rs/ignore 自称 "WalkParallel is a parallel recursive directory iterator")。默认按 CPU 核数开工作线程,用无锁 Chase-Lev 工作窃取队列分配任务,结果在内存中按文件缓冲以避免输出串行化。grep/find 均为单线程遍历。
- 聪明默认 = 搜索集合小一个数量级。rg/fd 默认尊重
.gitignore、跳过隐藏文件与二进制文件。rg README 另附一组"不启用 gitignore 时"的基准作对照——差距缩小但仍领先,说明"少扫文件"与"扫得快"是乘法关系。忽略规则本身也被编译为单个正则、路径单遍匹配,摊薄忽略检查成本。 - 反直觉的 mmap 策略。对海量小文件,内存映射反而更慢(Linux 内核树基准:普通读 0.334s vs mmap 1.611s),rg 仅对少数大文件启用 mmap;IO 策略的取舍在 CHANGELOG 里有长期打磨记录(如 macOS 上禁用自动 mmap)。
诚实边界:单个大文件 + 简单模式时 grep -E 偶尔更快(rg issue #1263 记录约慢 6–7ms);ugrep 在部分负载上更快但未形成生态优势。Windows 意义:Windows 内置的 findstr 是实测的最大落后者(慢 rg 约 5.6–9.8 倍,两次测量的口径见 §2.6,且默认不搜隐藏文件、UTF-8 支持差),这是 Windows 用户迁移收益最高的一个替换。
2.3 fd vs GNU find:多线程遍历的胜利与表达式语言的缺席
能力:fd 语法直觉化(fd "\.md$" 即全路径正则查找),默认彩色、并行、忽略隐藏与 gitignore,-x/-X 直接批量执行命令(无需 find 的 -exec ... \; 转义学),支持 --changed-within 等时间糖;README 把 "Very fast due to parallelized directory traversal" 列为第一特性(fd README)。GNU find 的表达式语言(-mtime -size -perm -type -exec +)能力上仍是超集——法兰克福 LUG 的对比结论是"fd 确实更快,但提速倍数取决于用例;find 覆盖一些 fd 没有的文件属性用例"(fd_find.pdf)。
为什么快:基于 ignore crate(与 rg 同源)的多线程目录遍历——遍历本身就是并行的,这是对 find 单线程递归的代差;fd 还把并行做到命令执行层,-x 对每条结果并行运行外部命令,可用 -j 控制并发。代价是多线程与正则预编译的固定开销,所以存在著名反例:无模式纯列举时 find 可能快约一倍且 CPU 占用更低(fd issue #304)。本机 33.9 万文件目录带模式实测 fd 仍快 10.8 倍——带模式的真实场景中并行收益压倒性获胜。Windows 下 fd 与 rg 同用 ignore crate 的并行遍历(§2.2),配合 Defender 进程排除后收益尤其明显(§3.3 ③)。
2.4 bat vs cat:唯一"不比传统快"的替代品——这正是它诚实的地方
能力:基于 syntect 的语法高亮、左侧 Git 修改标记(与 HEAD/index 对比)、行号、自动分页(长输出走 less)、-l <lang> 强制语言、内置多主题(README 定位:"A cat(1) clone with syntax highlighting and Git integration",bat README;syntect 架构见 issue #423)。
性能诚实声明:本机实测同一 16KB markdown 文件,bat 0.180s vs cat 0.098s——bat 比慢不起眼的 cat 更慢,因为高亮和 Git 调用有真实成本。它的价值函数不是吞吐而是"人眼阅读效率"。同时它通过两条机制保住"脚本安全":检测到输出进入非交互管道时自动退化为纯文本、成为 cat 的 drop-in replacement(README 明文;v0.26.1 还专门修了管道场景装饰泄漏的兼容 bug,见 bat releases),以及默认分页可关。批处理脚本、重定向到文件等场景应继续用 cat。
Windows 注意:bat 在 PowerShell 中与内置别名 cat(= Get-Content)冲突,需 Remove-Item Alias:cat 后再设别名;渲染中文/emoji 需要 UTF-8 代码页(Windows Terminal + chcp 65001 或 [Console]::OutputEncoding)。v0.26.1 专门修复了 PowerShell 5.1 补全兼容——Windows 是其持续维护目标。
2.5 zoxide vs z.sh / autojump / fasd:品类终局
原理:每次 cd 时 shell 钩子把路径写入本地 frecency 数据库;跳转时对候选做 fzy 风格的模糊评分(子序列匹配 + 连续/开头/间隔惩罚),综合频率与近期度排序,z keyword 一步到达。纯 Rust 单二进制,数据库读写开销毫秒级。相对前辈的性能优势在实现形态:autojump 每次跳转要拉起一个 Python 解释器、z.sh 在 shell 里逐条算分,zoxide 是编译型单二进制 + 本地数据库,shell hook 只做最薄的记录。
竞品现状:z.sh(Shell 脚本,2009,rupa/z)与 autojump(Python,已停更)是它取代的前代;fasd 功能更广(可跳文件/程序)但更慢且维护不活跃;社区共识是 zoxide 为"更快的 z"且跨 shell 支持最全(honeypot.net 评测、LibHunt)。
诚实边界:跳转本身都是毫秒级,zoxide 的胜出维度是跨 shell 一致性 + 模糊匹配质量 + 零依赖,而非本次对比意义上的"快";zsh 自带的目录栈/cd -0 对轻量用户也够用(r/commandline 讨论)。
2.6 本机实测记录(2026-10-29,Windows 11,Git Bash)
以下数据记录于横轴章节(撰写当日上午本机执行,bash 内建 time 计时,输出重定向至 /dev/null 丢弃)。实验环境(定稿时于同一台机器现场查询,与实测同日同机):
- 硬件:Intel Core i7-14650HX(16 核 24 线程,
Get-CimInstance Win32_Processor);16 GB DDR5-5600(SK Hynix);UMIS RPJYJ1T24MLR1HWY 1 TB NVMe SSD(系统盘 C:,两个测试目录均在其上)。 - Defender 状态:实时保护开启(
Get-MpComputerStatus:RealTimeProtectionEnabled=True);进程/路径排除项需管理员权限,Get-MpPreference返回 "N/A: Must be an administrator to view exclusions",实测时是否存在排除无法确认——按无排除理解更保守(排除方法见 §3.3 ③;Defender 是 Windows 上最大的性能变量,见同节)。 - 工具版本:ripgrep 15.1.0、fd 10.5.0、bat 0.26.1、GNU find 4.10.0、GNU grep 3.0(
/usr/bin/grep)、ugrep 7.8.4、hyperfine 2.0.0。 - 重要披露——
grep的 shim:本机 Git Bash 中grep并非 GNU grep,而是 ZCode 注入的 shell 函数(type grep可见),透明转调 ugrep 7.8.4(D:/Users/马鑫悦/AppData/Local/Programs/ZCode/resources/tools/ugrep/ugrep.exe),并固定附加-G --ignore-files --hidden -I --exclude-dir=.git …参数。原始记录的 "grep" 行即经此函数运行(定稿复测数值吻合证实,见下)。因此下文区分 ugrep(shim 转调) 与 GNU grep 两个对照,前者还因--ignore-files而搜索范围小于 rg 的--no-ignore --hidden。 - 各测试所用目录:内容搜索 = 目录 A;文件名查找 = 目录 B;文件查看 = 单文件操作、与目录无关(原始记录未指明具体文件,定稿复测改用一个 19 KB 的 SKILL.md,结论一致)。
- 各测试循环次数:内容搜索三项分别为 rg 5 次、grep(实为 ugrep)5 次、findstr 3 次;文件名查找为 fd 3 次、find 3 次;文件查看各 1 次(原始记录为单值)。
- 目录 A =
C:/Users/马鑫悦/.zcode/cli(记录时 4,486 文件 / 621 MB;定稿复测 4,513 文件 / 626 MB——活动目录自然漂移);目录 B =C:/Users/马鑫悦/.zcode/workspace(338,740 文件;定稿复测find . -type f | wc -l逐文件计数完全一致)。 - 内容搜索(目录 A;模式
plugin,大小写不敏感,输出重定向至 /dev/null 丢弃):rg -il --no-ignore --hidden "plugin" .5 次:0.264 / 0.234 / 0.238 / 0.304 / 0.242 → 均值 0.256s(定稿复测 5 次 0.252–0.318,均值 0.262,吻合)。grep -ril --binary-files=without-match "plugin" .——经 shim 实为 ugrep 7.8.4(且带--ignore-files,搜索范围比 rg 更小)5 次:0.516 / 0.515 / 0.532 / 0.518 / 0.501 → 均值 0.516s(复测 0.504–0.532,吻合)。rg ≈ 2.0×(对照 ugrep)。- 真 GNU grep 3.0(
/usr/bin/grep,同参数;定稿新增复测)5 次:1.933–2.037s → 均值 ≈1.97s。rg ≈ 7.5×(对照 GNU grep)。 cmd /c findstr /S /M /I "plugin" *.*3 次:2.954 / 2.317 / 2.295 → 均值 2.522s,rg ≈ 9.8×。⚠️ 调用陷阱(定稿发现):从 Git Bash 裸调该命令时,MSYS 对以/开头的参数做路径改写,命令会静默空跑(实测 0.09s 且零输出;cmd /c cd同样只打印交互式 banner 而不执行 cd)——须加MSYS_NO_PATHCONV=1(或改在 cmd / PowerShell 中运行)才是真扫描。真扫描复测 3 次:1.527 / 1.446 / 1.394 → 均值 ≈1.46s(hyperfine 独立交叉验证 1.365s±0.022s),即 rg ≈ 5.6×。清晨记录 9.8× 与定稿复测 5.6× 均为真实全树扫描(findstr 均有数百个匹配文件),差距未能完全归因(候选:页面缓存温度、Defender 状态差异),两次数值如实并存,引用时建议给出 5.6–9.8× 区间。
- 文件名查找(目录 B;模式
\.md$,fd 含-HI对齐 find 语义):fd -HI "\.md$" .3 次:1.075 / 1.043 / 1.032 → 均值 1.05s(复测 1.017 / 1.014 / 1.093,吻合);find . -name "*.md"3 次:11.146 / 11.304 / 11.589 → 均值 11.35s(复测 11.014 / 11.187,吻合)。fd ≈ 10.8×。 - 文件查看(单个约 16 KB markdown,目录无关):
bat --paging=never0.180s vscat0.098s——bat 更慢,印证 §2.4 的诚实声明(定稿复测:bat 0.085–0.164s vs cat ≈0.077s,样本为 19 KB SKILL.md,结论一致)。
计时方法补充:原始记录称 hyperfine 在 Git Bash 下因 Windows shell 调用约定报错 Error: Could not measure shell execution time,故改用 bash 内建 time 循环计时;定稿复测中 hyperfine 2.0.0 对纯命令(rg)与 cmd /c 嵌套命令(findstr)均正常完成计时(rg 188.2 ms±18.6 ms——比 bash time 的 0.26 s 少约 70 ms,即 shell 启动开销;findstr 1.365s±0.022s),原始报错未能复现,可能与当时的具体命令形态有关。遇同类报错时,可改在 PowerShell 中运行 hyperfine,或用 bash 内建 time 多次循环计时。
上述倍数与公开基准量级一致:macOS 1GB 单文件基准 rg 比 grep 快约 13×(Medium);目录树场景约 20×(Reddit 转载作者基准、Simon Willison 摘要)。
三、交叉洞察:两轴结合说明了什么
3.1 课题的完整答案:把"快"拆成三种,标题才成立
单看纵轴或单看横轴,都会把结论读偏。纵轴显示 ripgrep/fd 的速度来自架构差异而非"用 Rust 重写就快"——GNU grep 本身已是单文件搜索的工程巅峰,rg 的数量级优势来自"目录树级并行"这一 grep 架构上不打算做的事:公开基准目录树场景约 20×(Reddit 转载作者基准、Simon Willison 摘要,出处详见 §2.6 末),而本机文件列表模式实测为 2.0×(对照为 shim 转调的 ugrep;对 GNU grep 复测为 7.5×)——差异来自负载与默认开关,两组数字不应对质。横轴实测给论断钉上的数字是(rg vs ugrep 2.0×、vs GNU grep 7.5×、vs findstr 5.6–9.8×,fd vs find 10.8×),并暴露了两个反例(无模式列举 find 更快、bat 比 cat 慢)。两轴合起来才能给出分辨:
- rg / fd 快在 CPU 时间(本报告 §2.2–2.3 的组合拳);
- bat 快在"功能—延迟"折中——它从来不比 cat 快,赢的是可读性,管道中还能体面退化为 cat;
- zoxide 快在人机交互时间——跳转本身毫秒级,省的是"人敲键盘的时间"。
把它们混为一谈,"为什么比传统工具快"这个课题就会失真:这批工具的真正共性不是速度,而是重新设计的默认值 + 更好的人机接口。
3.2 纵轴解释了横轴格局的成因
- 为什么是 Rust:Rust 1.0(2015)让重写成为划算的工程决策;而 fd 的 Cargo.toml 直接依赖 rg 的
ignore+regexcrate,说明四件套不是四个孤立作品,而是一套共享基础设施的性能工程模板被反复实例化——这解释了横轴上"性能来源高度一致"(多线程并行 + 预编译数据结构 + 默认收缩搜索域)的现象。fzf 自 2013 年起的模糊交互层则说明,替代运动是生态协作而非单点竞争。 - 为什么基准数字可信:2016 年那篇博客把"公开、可复现、含对照组的基准"变成行业惯例,横轴章节自己的本机计时正是这一惯例的延续。一手来源还两次纠正了二手叙事——"ripgrep 1.0"查无此版(版本序列从 0.10 跳到 11);zoxide 首发是 2020-03-05 而非社区常写的 2019 年(GitHub Releases API 核实,裁决记录见附录 A)。
- 为什么 2026 年的战场是 Windows:纵轴阶段三(2020 年 Windows Terminal / winget / scoop 三件套就位 + 静态 exe 分发)解释了横轴观察到的现状——四件套 2025–2026 年的 changelog 反复出现 PowerShell/Windows 专项修复(bat PS 5.1 补全、zoxide 非 Cygwin POSIX 支持、rg 的 MSVC 官方预编译渠道),Windows 是这套工具的主要增量市场。
3.3 对用户的判断与建议
① 分层替换策略(核心建议):交互层全面替换(rg / fd / bat / zoxide 是该运动中成熟度最高、不可替代性最强的四员),脚本与 CI 保留 grep / find / cat 作为 POSIX 公分母。何时不要替换:
- CI/构建脚本依赖 GNU find 表达式(
-perm、-newer)的:保留 find,fd 不做属性表达式语言; - 需要 PCRE 回溯语义(如嵌套量词)的脚本:rg 加
-P可用但默认引擎拒绝,谨慎移植; - 纯字节流管道(
cat a b | wc -l):cat 无可替代; - 团队规范/审计要求工具链可复现(POSIX 指定 grep/find):现代工具放个人层,脚本层保持 POSIX。ripgrep README 也有专门一节 "when NOT to use"("You need a portable and ubiquitous tool")。
② 渐进迁移映射表:
| 旧习惯 | 新写法 | 备注 |
|---|---|---|
grep -r "TODO" . | rg "TODO" | 默认忽略 .gitignore,行为差异即收益 |
grep -ril | rg -il | 参数风格刻意兼容 |
findstr /S /I "x" *.* | rg -i "x" | Windows 用户收益最大的替换;Git Bash 裸调 cmd /c findstr 有参数改写陷阱(§2.6) |
find . -name "*.md" | fd -H -e md | -H 才搜隐藏;默认排除是特性 |
find . -name "*.log" -exec rm {} \; | fd -H -e log -x rm | 无需 \; 转义。⚠️ 安全备注:fd 默认尊重 .gitignore——gitignore 规则命中的文件会被静默跳过(-H 只补隐藏文件,不覆盖忽略规则);删除类操作应先去掉 -x 用同参数列出清单人工确认,或加 -I(--no-ignore)连忽略文件一起匹配 |
cat app.py | bat app.py | 交互终端专用;管道/重定向仍用 cat |
cd ~/work/api && cd - | z api | z - 回跳上次目录 |
| 性能对比 | hyperfine 'rg x' 'grep -r x' | 标准测速工具;Git Bash 下可能报 "Could not measure shell execution time"(§2.6 有原始记录;定稿复测 2.0.0 未复现),遇错可改在 PowerShell 运行,或用 bash 内建 time 多次循环计时 |
③ Windows 落地清单(2026-10-29 实操版):
安装(winget 渠道已在本机用 winget list 验证,包 ID:BurntSushi.ripgrep.MSVC、sharkdp.fd、sharkdp.bat、ajeetdsouza.zoxide;MSVC 版兼容性比 GNU 变体更稳):
winget install BurntSushi.ripgrep.MSVC sharkdp.fd sharkdp.bat ajeetdsouza.zoxide
# 备选:scoop install ripgrep fd bat zoxide(无 UAC 弹窗,shims 接管 PATH)
# choco install ripgrep fd bat(rg 官方 README 确认的 Windows 渠道之一,本机未实测)
# cargo install fd-find 等(需 Rust 工具链)winget 两大已知坑:安装后 rg 不在 PATH(microsoft/winget-cli#3284);升级后 fd/rg 命令从 PATH 消失(#4800)。缓解:重开终端;仍缺失则确认 WinGet\Links 在用户 PATH 中,或改用 scoop。
性能调校(收益最大的一条):Windows Defender 实时扫描会逐文件挂钩 I/O,是 rg/fd 在 Windows 上"不如官网视频快"的头号外部原因——rg 需要高速打开大量小文件,每个文件都触发实时扫描(rg issues #1263、#1860;社区实测应用可因此慢达 80%:BornCity)。JetBrains 是同一问题的另一当事方:官方博客记载 Rider/ReSharper 曾因 Defender 逐文件扫描而首启多花 10–40 秒,Rider 安装器甚至会直接调用 Add-MpPreference 添加 Defender 排除(JetBrains .NET 博客,2026-09);其官方支持文档亦收录 Defender 对构建速度的影响与 IDE 检测/排除引导(Antivirus Impact on Build Speed、YouTrack: How to exclude IDE folders from the security scan)。微软官方提供排障指南(Learn: Troubleshoot performance issues)。按进程排除比按路径排除更有效(PixInsight 论坛实测):
# 管理员 PowerShell
Add-MpPreference -ExclusionProcess "rg.exe","fd.exe","bat.exe"
# 或对代码目录按路径排除
Add-MpPreference -ExclusionPath "D:\code"验证方法:rg --stats <pattern> <dir> 前后对比时间与吞吐统计(需在政策允许时操作)。
Shell 接线:
# PowerShell(写入 $PROFILE,zoxide README 原文)
Invoke-Expression (& { (zoxide init powershell | Out-String) })
# bat:先清掉内置别名再接管
Remove-Item Alias:cat -Force -ErrorAction SilentlyContinue
Set-Alias cat bat
# 中文渲染保险
[Console]::OutputEncoding = [Text.UTF8Encoding]::new()Git Bash / WSL:eval "$(zoxide init bash)";rg/fd/bat 开箱即用,GNU grep/find 仍在 PATH 中共存,可渐进迁移(注意:本机 Git Bash 的 grep 是 ZCode 注入的 shim 函数、实转调 ugrep,见 §2.6 披露;需要真 GNU grep 时用 /usr/bin/grep)。cmd:经 Clink 加载 clink-zoxide。常见坑:zoxide init 后数据库为空,需先正常 cd 几次积累记录(zoxide#293);PowerShell 下空格+Tab 交互补全尚不完善(zoxide#837),纯 z 关键词 不受影响。WSL 深度用户注意:跨系统访问 /mnt/c 走 9P 协议会显著变慢,重遍历任务应在原生 Windows 侧执行。
配置与胶水:rg 持久配置走 RIPGREP_CONFIG_PATH 环境变量(rg 官方 GUIDE 记载的机制,此条未在会话中逐字核验原文);bat 接管手册页:export MANPAGER="bat -plman";rg 处理中文老文档时用 -E/--encoding 指定 GBK/Shift_JIS(UTF-16 靠 BOM 自动检测)。常见组合:rg --files | fzf 选文件、fd -e md -x pandoc {} 批量转换、VS Code/neovim telescope 默认以 rg/fd 为后端。
④ 预期管理:提速倍数取决于负载与对照工具——本机 rg 对 shim 转调的 ugrep 仅 2.0×、对 GNU grep 7.5×(带 -i 的文件列表模式),findstr 两次测量分别为 9.8× 与 5.6×(§2.6);公开基准里单文件可达 13×、目录树 20×;fd 无模式列举反而可能比 find 慢一倍;Defender 排除与否能差出 80%。看任何"快 N 倍"的说法都要先问测试负载与对照工具。
四、参考来源
性能原理与基准
- BurntSushi(ripgrep 作者)基准长文(2016-09-23):https://burntsushi.net/ripgrep/
- Simon Willison 摘要:https://simonwillison.net/2019/Apr/16/ripgrep
- docs.rs crate 文档:regex(线性时间) · memchr(SIMD) · ignore(WalkParallel)
- rg 反例 issue:https://github.com/BurntSushi/ripgrep/issues/1263 ;ugrep 讨论:https://github.com/BurntSushi/ripgrep/discussions/2597
- 1GB 单文件基准(13×):https://medium.com/@adamprzblk/grep-vs-ripgrep-1gb-file-benchmark-on-macos-a75437967945
- fd vs find 对比讲义(法兰克福 LUG):https://wiki.lugfrankfurt.de/gitea/LUG_Frankfurt/hugo/raw/commit/e5c292677d925496334d94551de8e619ff9fe9f1/static/talks/fd_find.pdf
- fd 无模式反例:https://github.com/sharkdp/fd/issues/304
- Reddit 转载作者基准:https://www.reddit.com/r/programming/comments/118w06q/why_gnu_grep_is_fast
版本与发布(GitHub Releases API,2026-10-29 查询;定稿时对关键日期二次复核)
- ripgrep:Releases API · CHANGELOG · README · 15.0.0 notes
- fd:Releases API · README · CHANGELOG · Cargo.toml · v10.0.0 notes
- bat:Releases API · README · issue #423
- zoxide:Releases API · latest · README
- 定稿复核记录:fd v10.3.0=2025-08-26、v10.4.0=2026-03-07、v10.5.0=2026-08-26;rupa/z(z.sh)仓库创建于 2009-06-25(API);clvv/fasd 创建于 2011-12-08(API);ScoopInstaller/Scoop 创建于 2013-05-11(API)
前辈工具与历史
- ack:https://beyondgrep.com/ · ag 与 Red Hat 打包评审:https://bugzilla.redhat.com/show_bug.cgi?id=1008063 · ag 发布时间考
- autojump:https://github.com/wting/autojump · fzf(创建于 2013-10-23):https://api.github.com/repos/junegunn/fzf · z.sh:https://github.com/rupa/z · fasd:https://github.com/clvv/fasd
- grep 历史:Wikipedia: grep · Princeton: ed to grep
- Rust 1.0 公告:https://blog.rust-lang.org/2015/05/15/Rust-1.0.html
竞品与生态
- zoxide vs z/autojump/fasd:https://www.libhunt.com/compare-zoxide-vs-z 、https://honeypot.net/2021/02/26/new-favorite-command.html
- shell 内建替代论:https://www.reddit.com/r/commandline/comments/4v5nlt/what_cd_tool_do_you_use_if_any_autojump_j_z_etc
- Rust CLI 全景清单(§2.1 引用):https://gist.github.com/sts10/daadbc2f403bdffad1b6d33aff016c0a 、https://zaiste.net/posts/shell-commands-rust 、https://deepu.tech/rust-terminal-tools-linux-mac-windows-fish-zsh
Windows 专项
- VS Code 1.11 更新日志:https://code.visualstudio.com/updates/v1_11
- winget PATH 坑:https://github.com/microsoft/winget-cli/issues/3284 、https://github.com/microsoft/winget-cli/issues/4800 ;winget-cli 仓库:https://github.com/microsoft/winget-cli
- Defender 性能影响与进程排除:https://pixinsight.com/forum/index.php?threads/file-access-slowness-caused-by-windows-defender-new-workaround.21440 、https://borncity.com/win/2020/03/08/windows-server-2019-defender-performance-issues 、https://medium.com/@jbird24/how-to-confirm-if-microsoft-defender-scanning-is-causing-application-performance-issues-e73daf25597e 、微软官方排障:https://learn.microsoft.com/en-us/defender-endpoint/troubleshoot-performance-issues
- JetBrains 与 Defender:Antivirus Impact on Build Speed(官方支持 KB) · How to exclude IDE folders from the security scan(YouTrack 官方文章) · Why Rider and ReSharper Were Slow to Start(JetBrains .NET 博客)
- rg Defender 相关 issues:https://github.com/BurntSushi/ripgrep/issues/1263 、https://github.com/BurntSushi/ripgrep/issues/1860
- zoxide PowerShell 接线与坑:https://github.com/ajeetdsouza/zoxide/discussions/293 、https://github.com/ajeetdsouza/zoxide/issues/837
- Scoop vs winget:https://github.com/ScoopInstaller/Scoop/issues/3992
未验证声明(如实保留):choco 渠道安装命令来自社区清单(https://gist.github.com/mikepruett3/7ca6518051383ee14f9cf8ae63ba18a7 ),本机未安装 choco、未实测;ripgrep-prebuilt 的 Microsoft 官方重建渠道来自搜索摘要,未逐一核实其仓库状态;RIPGREP_CONFIG_PATH 机制出自 rg 官方 GUIDE,未在本会话逐字核验原文行号;JetBrains 支持 KB 文章正文因站点反爬(HTTP 403)未能直接抓取,其存在与主题经检索结果交叉确认,IDE 内"检测 Defender 并引导排除"的表述以该文档及官方博客为据。
附录 A:综合过程记录——两章矛盾裁决存档
本附录为定稿存档:记录纵轴、横轴两章合并为综合报告过程中的矛盾裁决与处理方式,供复核追溯。正文只保留裁决结果,不再保留两章的原始分歧表述。
- zoxide 首发年份:横轴章节总表曾写"2019 年首发",纵轴章节经 GitHub Releases API 核实为 2020-03-05。本报告采用 2020 年(一手 API 证据优先,见 §2.1 成熟度行)。
- ripgrep 的 winget 包 ID:纵轴章节声明"未能从官方 README 核实",横轴章节本机
winget list实际验证了BurntSushi.ripgrep.MSVC。本报告采用横轴结果,纵轴的存疑标记解除。 - fd 10.5.0 发布日期:纵轴章节时间线表格曾将其列于"2026-07"行下但注明 08-26,属排版笔误;统一为 2026-08-26。定稿时经 GitHub Releases API 复核:v10.5.0 发布于 2026-08-26T07:59Z,且 10.3.0 恰好同为 08-26(见 §1.6 注)。
- 性能原理与 Windows 清单两章各写一遍:已分别合并为 §2.2(原理:纵轴的四板斧 + 横轴的字面量/Teddy/mmap/忽略规则编译五点,去重后按机制归类)与 §3.3 ③(清单:以横轴本机验证结果为主干,补入纵轴独有的 choco/cargo 渠道、编码、
RIPGREP_CONFIG_PATH、MANPAGER 条目)。 - 重复叙事(基准文化、VS Code 内嵌、Defender、"何时不要替换")两章均出现,本报告只在最合适的一处完整展开。
- z.sh 年份(定稿补充裁决):纵轴章节写 2010、横轴章节写 2011,两处原本均未注出处。GitHub API 核实 rupa/z 仓库创建于 2009-06-25(https://api.github.com/repos/rupa/z ),全文统一为 2009(§1.1、§1.3、§1.5、§2.5)。
*本报告为定稿(final)。前身为 output/reports/drafts/2026-10-29-终端工具链现代替代品-ripgrep-fd-bat-zoxide-综合报告.md(初稿按原样保留于 drafts/,未改动)。章节来源:output/reports/parts/2026-10-29-终端工具链现代替代品-ripgrep-fd-bat-zoxide-vertical.md(纵轴)、output/reports/parts/2026-10-29-终端工具链现代替代品-ripgrep-fd-bat-zoxide-horizontal.md(横轴)。定稿按独立审读意见逐条修订,复核过程中新增两项对本报告结论有实质影响的本机发现,均已写入 §2.6:① 本机 Git Bash 的 grep 是 ZCode 注入的 shim 函数、实际转调 ugrep 7.8.4——初稿"rg ≈2.0× vs grep"的对照实为 ugrep,对真 GNU grep(/usr/bin/grep 3.0)复测为 ≈7.5×;② 从 Git Bash 裸调 cmd /c findstr 会因 MSYS 参数改写而静默空跑,真扫描复测为 rg ≈5.6×(清晨记录 9.8× 为真实扫描,两值并存并注明差异未定因)。*