现代命令行工具:ripgrep、fd、bat、fzf 值得换吗
grep、find、cat、Ctrl+R 用了十年也没觉得不行——直到换成现代替代品,才发现原来可以更舒服。
一、ripgrep(rg):更快的 grep
| 对比 | grep -r | rg |
|---|---|---|
| 速度 | 一般 | 快数倍(并行 + 优化) |
| 默认递归 | 要加 -r | 默认递归 |
| 忽略 .gitignore | 要手动排除 | 默认遵守 |
| 忽略二进制 | 会输出乱码 | 自动跳过 |
| 文件类型过滤 | 麻烦 | --type 一行搞定 |
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
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 的写法:
find . -type f -name "*.log" -not -path "*/node_modules/*"
fd "*.log" # 默认就排除 gitignore三、bat:带高亮的 cat
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:模糊搜索一切
这是改变我终端习惯最大的一个工具。
sudo apt install -y fzf
# 基础:模糊搜索文件
fzf # 当前目录下交互式搜索
vim $(fzf) # 搜索并打开
# Ctrl+R:搜索历史命令(装了就自动替换)
# Ctrl+T:搜索文件并插入路径
# Alt+C:搜索目录并 cd 过去装完后把这三件事绑定上(fzf 自带脚本):
# ~/.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"进阶用法:
# 带上预览窗口(配合 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 / exa | ls | 彩色、树形、显示 git 状态 |
duf | df | 更清晰的磁盘显示 |
btop | top | 图形化资源监控 |
ncdu | du | 交互式查目录占用 |
zoxide | cd | 记住常去目录,z baize 直达 |
jq | — | JSON 处理(见专篇) |
mtr | traceroute | 实时路由诊断 |
httpie / xh | curl | 更友好的 API 调试 |
六、什么时候不该换
现实约束:
- 服务器上通常没有:这些工具要额外安装,而在别人的机器/生产环境里,你可能只有原生的 grep/find;
- 脚本里要用原生命令:写给别人跑的脚本,依赖 rg/fd 会增加部署成本;
- 肌肉记忆:
grep -rn已经刻在手上,强制自己换反而慢。
我的分工:
- 本地开发机:全换,图舒服;
- 服务器:只装必要的(rg、bat 值得装,fd 看情况);
- 脚本:一律用原生命令,保证可移植。
# 服务器上我只装这两个
sudo apt install -y ripgrep bat七、别名方案(兼顾兼容)
# ~/.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作为退路。
八、安装汇总
# 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
# 一次性脚本(新机初始化用)这些工具不改变你能做什么,但让每天敲几百次的命令少一点摩擦。累积下来是很大的收益。
