现代命令行工具:ripgrep、fd、bat、fzf 值得换吗

grep、find、cat、Ctrl+R 用了十年也没觉得不行——直到换成现代替代品,才发现原来可以更舒服。

一、ripgrep(rg):更快的 grep

对比grep -rrg
速度一般快数倍(并行 + 优化)
默认递归要加 -r默认递归
忽略 .gitignore要手动排除默认遵守
忽略二进制会输出乱码自动跳过
文件类型过滤麻烦--type 一行搞定
bash
sudo apt install -y ripgrep     # 命令是 rg

rg "server_name"                # 当前目录递归搜索
rg -i "error"                   # 忽略大小写
rg "TODO" --type md             # 只搜 markdown
rg "TODO" -g "!*.min.js"        # 排除某类文件
rg -l "TODO"                    # 只列文件名
rg -C 3 "panic"                 # 显示前后 3 行
rg -n --hidden "config"         # 包含隐藏文件
rg --stats "pattern"            # 看搜索统计

# 替代 grep 在管道里的用法(用 -e 或直接)
journalctl -u nginx | rg "error|warn"

最爽的一点是默认遵守 .gitignore:在项目里搜代码不会搜出 node_modules 里的一堆匹配。

二、fd:更好用的 find

bash
sudo apt install -y fd-find     # Debian 下命令是 fdfind
ln -s $(which fdfind) ~/.local/bin/fd

fd pattern                      # find . -iname "*pattern*"
fd "*.conf"                     # 按扩展名
fd -e log                       # 等价于上面
fd "nginx" /etc                 # 指定目录
fd -t d "cache"                 # 只找目录(-t f 文件,-t l 软链)
fd -H "ssh"                     # 包含隐藏文件
fd -x rm {}                     # 对结果执行命令
fd "*.log" -X rm                # 批量(-X 一次传入多个)

# 组合:找到并查看
fd "*.conf" -x bat {}

对比 find 的写法:

bash
find . -type f -name "*.log" -not -path "*/node_modules/*"
fd "*.log"                    # 默认就排除 gitignore

三、bat:带高亮的 cat

bash
sudo apt install -y bat        # Debian 下是 batcat

bat file.conf                  # 语法高亮 + 行号
bat -n file                    # 强制显示行号
bat -A file                    # 显示不可见字符(排查空白符)
bat --diff a.txt b.txt         # 带高亮的 diff
bat -r 10:20 file              # 只看 10-20 行
bat -l json data               # 强制指定语言

# 当 man 的阅读器(很舒服)
export MANPAGER="sh -c 'col -bx | bat -l man -p'"

核心优势:

  • 语法高亮;
  • 自动分页(长文件不会刷屏);
  • 显示 git 修改标记;
  • 管道里自动关闭装饰(不会输出乱码)。

四、fzf:模糊搜索一切

这是改变我终端习惯最大的一个工具。

bash
sudo apt install -y fzf

# 基础:模糊搜索文件
fzf                             # 当前目录下交互式搜索
vim $(fzf)                      # 搜索并打开

# Ctrl+R:搜索历史命令(装了就自动替换)
# Ctrl+T:搜索文件并插入路径
# Alt+C:搜索目录并 cd 过去

装完后把这三件事绑定上(fzf 自带脚本):

bash
# ~/.bashrc
[ -f /usr/share/fzf/key-bindings.bash ] && source /usr/share/fzf/key-bindings.bash
[ -f /usr/share/fzf/completion.bash ] && source /usr/share/fzf/completion.bash

export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --preview-window=right:50%"
export FZF_DEFAULT_COMMAND="fd --type f --hidden --exclude .git"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

进阶用法:

bash
# 带上预览窗口(配合 bat)
export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS --preview 'bat --color=always --style=numbers {} 2>/dev/null'"

# 搜索并 kill 进程
kill -9 $(ps aux | fzf | awk "{print \$2}")

# 搜索 git 分支并切换
git branch | fzf | xargs git checkout

# 搜索历史 cd 过的目录
# 配合 zoxide 更好用

五、其他值得一试的

工具替代亮点
eza / exals彩色、树形、显示 git 状态
dufdf更清晰的磁盘显示
btoptop图形化资源监控
ncdudu交互式查目录占用
zoxidecd记住常去目录,z baize 直达
jqJSON 处理(见专篇)
mtrtraceroute实时路由诊断
httpie / xhcurl更友好的 API 调试

六、什么时候不该换

现实约束:

  1. 服务器上通常没有:这些工具要额外安装,而在别人的机器/生产环境里,你可能只有原生的 grep/find;
  2. 脚本里要用原生命令:写给别人跑的脚本,依赖 rg/fd 会增加部署成本;
  3. 肌肉记忆grep -rn 已经刻在手上,强制自己换反而慢。

我的分工:

  • 本地开发机:全换,图舒服;
  • 服务器:只装必要的(rg、bat 值得装,fd 看情况);
  • 脚本:一律用原生命令,保证可移植。
bash
# 服务器上我只装这两个
sudo apt install -y ripgrep bat

七、别名方案(兼顾兼容)

bash
# ~/.bashrc:有就用新的,没有就退回原生的
if command -v rg > /dev/null; then
  alias grep="rg"
fi

if command -v batcat > /dev/null; then alias bat="batcat"; fi
if command -v bat > /dev/null; then alias cat="bat --paging=never"; fi

if command -v fdfind > /dev/null; then alias fd="fdfind"; fi

cat 替换成 bat 要谨慎:某些脚本依赖 cat 的原始行为。我用 bat --paging=never 并保留 command cat 作为退路。

八、安装汇总

bash
# Debian/Ubuntu
sudo apt install -y ripgrep fd-find bat fzf eza btop ncdu mtr

# macOS
brew install ripgrep fd bat fzf eza btop ncdu mtr

# 一次性脚本(新机初始化用)

这些工具不改变你能做什么,但让每天敲几百次的命令少一点摩擦。累积下来是很大的收益。