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笔记