Claude、VS Code 等 AI 编程工具在项目里「找代码」时,底层跑的不是 grep,而是 ripgrep(rg)。这类 Rust 编写的现代 CLI 工具在速度、输出、默认行为上全面超越传统命令。以下按「传统命令 → 现代替代」逐项对比常用用法。

总览对照表

传统命令 现代替代 核心改进
ls eza 彩色、图标、git 状态、树状视图
cat bat 语法高亮、行号、分页
find fd 默认忽略 .gitignore/隐藏目录
grep rg 并行、默认递归、尊重 .gitignore
cd zoxide 按频率/时效记住目录
history/Ctrl+R atuin、fzf 全文/模糊搜索历史

ls → eza

场景 传统 ls eza
简单列出 ls eza
详细信息 ls -l eza -l(多了 git 状态列)
含隐藏文件 ls -la eza -la
显示图标 无 eza --icons
树状目录 ls -R(无层级感) eza --tree
git 状态(改/增/删) 需要 git status eza -l --git

常用组合:alias ls='eza --icons --git'。注意 eza 是 exa 停更后的社区 fork,图标需要 Nerd Font,否则显示方框。

cat → bat

场景 传统 cat bat
查看文件 cat file bat file(语法高亮+行号+自动分页)
带行号 cat -n file bat -n file(默认已有行号)
纯文本输出(管道用) cat file | wc -l bat -p file | wc -l(关闭高亮分页)
拼接文件 cat a b > c bat a b > c(行为一致)
强制指定语言高亮 无 bat -l json file
显示不可见字符 cat -A bat -A

bat 在管道/重定向时会自动退化为纯文本模式,不会把高亮转义符带进管道。Debian/Ubuntu 因命令名冲突安装的是 batcat。

find → fd

场景 传统 find fd
按名字找 find . -name "*.py" fd -e py(或 fd "*.py")
只找文件/目录 find . -type f fd -t f / fd -t d
含隐藏文件 find . -name ".*" fd -H
忽略 gitignore 限制 默认不含,须显式 -prune fd -I(不遵守 ignore 文件)
找最近修改 find . -mtime -7 fd --changed-within 7d
对结果执行命令 find ... -exec cmd {} \; fd -e py -x cmd

fd 最大的改进是默认行为反过来了:自动忽略 .gitignore、.git 和隐藏目录,所以 fd 在项目里找文件不会一头扎进 node_modules。

grep → rg

场景 传统 grep rg
单文件搜索 grep pattern file rg pattern file
递归目录 grep -r pattern . rg pattern(默认递归)
显示行号 grep -n 默认显示
忽略大小写 grep -i rg -i
只列文件名 grep -rl rg -l
计数 grep -rc rg -c
排除匹配 grep -v rg -v
上下文 grep -A2 -B2 rg -A2 -B2
整词匹配 grep -w rg -w
按类型过滤 无内置 rg -t js / rg -t py
列出项目文件 无对应 rg --files

rg 默认跳过 .gitignore 指定内容、隐藏文件,并行搜索,语法兼容 grep 大部分选项,迁移成本低。

cd → zoxide

场景 传统 cd zoxide
进入长路径 cd /home/user/projects/foo/bar z bar(按访问频率+时效匹配)
交互选择 无 zi(列出候选,方向键选)
回到上次目录 cd - z -(行为一致)
常用目录直达 靠手记 z proj 直达最常去的 proj*

zoxide 维护一个按 frecency(频率+时效)排序的目录数据库,z 关键词 自动跳到最匹配的目录。需要 shell hook 才能记录目录:eval "$(zoxide init bash)"(zsh/fish 同理),之后 z 就能用了。

历史搜索:Ctrl+R → atuin / fzf

场景 传统 shell atuin fzf
反向搜索历史 Ctrl+R(逐条翻,体验差) Ctrl+R(模糊+语法高亮) Ctrl+R(模糊,可预览)
全文搜命令 history | grep xxx atuin search xxx history | fzf
跨机器同步 无 内置(加密同步) 无
通用模糊筛选 无 仅历史 任意命令 | fzf、Ctrl+T 选文件

atuin 专精历史(全文搜索、加密同步、统计),fzf 是通用模糊查找器(接任意管道、Ctrl+T 选文件、Alt+C 跳目录)。两者默认都抢 Ctrl+R,需要二选一或改键位分开配。

为什么 rg 比 grep 快约 300 倍

在带 node_modules 的前端项目里,rg 比 grep 快约 300 倍:

  • 默认跳过 .gitignore 内容——grep 全量扫,把依赖目录也翻一遍;rg 直接忽略。
  • 并行搜索:rg 利用多核扫描文件。
  • Rust 实现:内存效率高、零开销抽象。

这也是 Claude、VS Code 选它做代码检索引擎的原因。

迁移建议与踩坑

  • 别一次全装:先上 rg + fzf,收益最高、学习成本最低;其余按需添加。
  • eza 图标要 Nerd Font,否则显示成方框。
  • atuin 与 fzf 抢 Ctrl+R,分开配。
  • alias 建议:
alias ls='eza --icons --git'
alias cat='bat'
alias find='fd'
alias grep='rg'
alias cd='zoxide'

原文:会勇禾口王的AI笔记