工具不是越多越好。这篇文章的定位不是”工具大全”,而是按场景给出推荐:遇到这类问题,该用什么。每个工具用一段说清楚它解决什么问题、核心用法是什么、什么时候不该用它——不做参数手册。

1. 选工具的基准

换工具有三个理由:更快(Rust/Go 重写,利用多核并行,比经典工具快 10-100 倍)、默认值更好(自动尊重 .gitignore、彩色输出、更清晰的错误信息)、填了空白(经典 Unix 工具集里根本没有的能力,比如模糊搜索、终端复用、JSON 处理)。

不换的理由:脚本里需要稳定可预期的输出,用 catgrepfind——它们跨平台、无依赖、行为一致。bat 的语法高亮和行号会污染管道;rg 默认跳过 .gitignore 忽略的文件,有时恰好是你要找的。

2. 替换关系速查

经典工具现代替代核心优势
grep -rrg(ripgrep)10-100x 更快,自动忽略 .gitignore 和二进制文件
findfd语法简洁,彩色输出,默认模糊匹配
catbat语法高亮、行号、Git 变更标记
cdz(zoxide)frecency 算法,关键词跳转常用目录
git diffdelta语法高亮、行级对比、侧边栏显示
tar/unzip/7zouch一个命令覆盖所有压缩格式
ls + FinderyaziVim 键位 TUI,三栏浏览 + 预览
topglances / htop全景监控 / 交互式进程管理
—(无对应)fzf模糊搜索,任何列表的交互式过滤器
—(无对应)jqJSON 路径表达式,管道友好
—(无对应)tmux / zellij终端复用,会话保持,分屏

3. 搜索与查找

ripgrep(rg) 是代码搜索的首选。速度快、自动跳过 .gitignorenode_modules,默认显示行号和彩色输出。

rg handleError               # 递归搜索(默认)
rg -l "TODO"                 # 只列出文件名
rg -C 3 "panic!"             # 上下各 3 行上下文
rg -t js "useState"          # 只搜 .js 文件
rg -i "error" /var/log/      # 忽略大小写

grep 的大多数参数 rg 都支持,迁移成本几乎为零。排查”为什么搜不到”时,先检查是否被 .gitignore 规则过滤——加 --no-ignore 可以绕过。

fd 是文件查找的首选。fd config 找名称包含 “config” 的文件,比 find . -name "*config*" 短得多。

fd config                    # 模糊匹配文件名
fd -e yaml                   # 按扩展名查找
fd -t d src                  # 只找目录
fd -e py -x wc -l            # 对每个结果执行命令

4. 交互选择

fzf 是模糊搜索的通用接口——它不关心数据来自哪里,只负责让你从列表里快速筛选一项。三种接入方式覆盖了大多数场景:

管道模式:任何列表都能接 fzf。

fd | fzf                                              # 交互式选文件
fd | fzf --preview "bat --color=always {}"           # 带预览窗口
git branch | fzf | xargs git checkout                 # 交互式切分支

Ctrl+R:安装 fzf 后,历史命令搜索变成模糊匹配——输入关键词,fzf 从全部历史里过滤,不再靠前缀匹配。

Ctrl+T:交互式选择文件路径并插入到当前命令行。

fzf 在 CI 和脚本里不适用(需要 TTY),但交互式工作流里几乎无处不在。

5. 查看与对比

bat 是查看代码文件的首选——语法高亮 + 行号 + Git 变更标记,比 cat 读起来省力。

bat src/main.rs              # 语法高亮 + 行号
bat -A config.yaml           # 显示不可打印字符(排查 BOM、Tab/Space)

脚本里仍用 catbat 的装饰性输出会破坏管道。bat --plainbat -p 输出裸文本,但不如直接用 cat 干净。

deltagit diff 可读。在 ~/.gitconfig 里配置一次,之后所有 git diff/show/log -p 自动使用:

[core]
    pager = delta
[delta]
    navigate = true        # n/N 在变更块间跳转
    line-numbers = true
    side-by-side = true    # 左右对比视图

6. 导航

zoxide 用 frecency 算法(频率 × 新近度)记忆你去过的目录,让你用关键词跳转:

# 初始化(加到 shell 配置里)
eval "$(zoxide init zsh)"
 
z proj       # 跳到包含 "proj" 的最常用目录
z back api   # 精确一点:同时包含 "back" 和 "api"
zi           # 交互式选择(结合 fzf)

~/work/backend~/work/frontend~/personal/blog 之间来回时,z backz frontz blogcd ~/work/backend 快得多。

7. 终端复用

终端复用器解决两个问题:会话保持(SSH 断开后进程继续运行)和多任务并行(同一终端窗口分屏同时看日志、写代码、跑测试)。

tmux vs zellij 的选择

tmuxzellij
学习曲线需要记快捷键(Prefix + 功能键)状态栏实时提示,自发现
SSH 远程成熟稳定,会话持久化(resurrect 插件)功能够用,生态较新
布局系统手动分割KDL 声明式,可版本化
适合场景服务器 SSH、长期稳定工作流本地开发、新手友好

推荐:本地开发用 zellij,SSH 到服务器用 tmux。两者可以共存。

tmux 核心工作流:

tmux new -s dev          # 创建名为 dev 的会话
tmux ls                  # 列出所有会话
tmux attach -t dev       # 重新连接到会话
# 在 tmux 内:Prefix + d  分离(会话继续运行)
# 在 tmux 内:Prefix + c  新建窗口
# 在 tmux 内:Prefix + |  垂直分屏(需自定义配置)

SSH 断线不影响 tmux 会话,重连后 tmux attach 恢复现场——这是在服务器上跑长任务时的标准做法。

8. 文件操作

yazi 是终端文件管理器,三栏视图(父目录 / 当前 / 预览),Vim 键位,内置预览(文本高亮 / 图片 / PDF 首页)。适合在目录结构里探索,找到文件后用 $EDITOR 直接打开。

# 退出后 cd 到所在位置(加到 shell 配置里)
function y() {
    local tmp="$(mktemp -t yazi-cwd.XXXXXX)"
    yazi "$@" --cwd-file="$tmp"
    if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
        cd -- "$cwd"
    fi
    rm -f -- "$tmp"
}

ouch 解决”压缩格式太多、命令各不相同”的问题——一个命令覆盖所有格式:

ouch d archive.tar.gz        # 解压(自动识别格式)
ouch d archive.zip
ouch c src/ output.tar.zst   # 压缩(根据扩展名选格式)
ouch l archive.tar.gz        # 查看内容(不解压)

zstd(.zst)是目前压缩率和速度平衡最好的算法,备份和传输优先考虑。

watchexec 监听文件变化并自动执行命令,解决”改了代码要手动跑测试”的循环:

watchexec -e py -- pytest          # .py 文件变化时跑测试
watchexec -e rs -- cargo check     # Rust 保存即检查
watchexec --restart "pnpm dev"     # 服务器模式(重启而非叠加)

watchexec 比语言专属工具(nodemon、cargo-watch)更通用——可以跑任何命令。

glow 在终端里渲染 Markdown,让 README 和文档可读而不是 cat 的原始文本:

glow README.md               # 渲染
glow -p README.md            # 分页模式(类似 less)
glow docs/                   # 目录里所有 md 文件的 TUI 列表

bat 和 glow 是互补的:bat 看代码文件(行号 + 语法高亮),glow 读文档文件(Markdown 格式渲染)。

9. 数据处理

数据格式决定工具选择:

JSON  →  jq
YAML / TOML  →  yq
CSV 小文件  →  miller (mlr)
CSV 大文件(>100MB)  →  xsv
不确定格式 / 先看看  →  visidata (vd)

jq 是 JSON 处理的标准工具,掌握三个操作覆盖 80% 场景:.key 提取字段、.[] 展开数组、select() 条件过滤:

curl -s api/users | jq '.[].name'
curl -s api/issues | jq '.[] | select(.state == "open") | .title'

yq 是 YAML/TOML/JSON 的 jq,语法高度兼容,还支持原地修改(-i):

yq '.services.web.image' docker-compose.yml
yq -i '.version = "2.0.0"' Chart.yaml        # 直接写文件,重要配置先备份
yq -o json config.yaml                        # YAML → JSON

miller(mlr) 是命令行版的 awk + SQL,适合表格数据的过滤、聚合、格式转换——而且结果可复现:

mlr --csv filter '$age > 30' data.csv
mlr --csv stats1 -a mean -f salary -g department data.csv   # 按部门统计均值
mlr --icsv --ojson cat data.csv                              # CSV → JSON

xsv 用 Rust 实现,处理 GB 级 CSV 极快,适合简单列操作:

xsv headers large.csv         # 看列名
xsv stats large.csv           # 统计摘要
xsv frequency -s status large.csv  # 列值频率

visidata(vd) 是终端里的表格软件,拿到陌生数据先 vd 看结构——CSV、JSON、SQLite、Excel 都能打开。确认字段后再写 mlr/xsv 的精确查询。

10. GUI 工具

“工具箱”不只是命令行。有些场景 GUI 工具更高效:

API 测试Bruno(开源,请求存储为文件可进 Git)、Hoppscotch(Web 版,协作友好)。Postman 功能最全但越来越重,Bruno 是轻量替代。

数据库TablePlus(macOS/Windows,支持 PG/MySQL/SQLite/Redis,界面简洁)、DBeaver(开源,全平台,支持几乎所有数据库)。

HTTP 流量调试Proxyman(macOS,HTTPS 解密流畅,App Store 有免费版)、Charles Proxy(跨平台,老牌工具)。移动端 API 调试必备。

终端模拟器Ghostty(GPU 渲染,极快,配置简洁)、WezTerm(Lua 配置,跨平台,内置多路复用)、iTerm2(macOS 老牌,功能最全)。

11. 工具进 dotfiles 才算资产

装了工具但没有配置它,下次换机器或者新环境里就不能用,等于工具没有真正拥有。

把这些放进 dotfiles:

  • shell alias(alias cat='bat'alias grep='rg'function y() {...}
  • 工具初始化(eval "$(zoxide init zsh)"、fzf 的 shell 集成)
  • delta 的 .gitconfig 配置
  • tmux 的 .tmux.conf 或 zellij 的 layout 文件
  • justfile 的全局 recipe

用 chezmoi 或类似工具管理 dotfiles(见 Dotfiles 管理),工具配置才能跟着你走,而不是每次重新装机都要重建。