在日常终端操作中,许多经典命令行工具(如 greplscddf 等)已经服务了几十年。它们稳定可靠,但也逐渐暴露出一些性能或用户体验上的不足。近年来,一批新的终端工具陆续出现,它们通过更智能的算法、更友好的交互界面以及更丰富的输出格式,为开发者提供了更高效的命令行体验。

本文介绍几个我在用的现代终端工具,你可以按需要选择是否去试用下,这些工具都是开源的,所以能保证它们的安全可靠。

由于不同操作系统、工具链有差异,我不会列出每个工具的安装方式,请自行到仓库路径下查找。


1. rg (ripgrep) —— 高性能递归搜索工具

替换目标grep
核心优势 :自动遵守 .gitignore 规则,支持并行递归搜索,内置高亮显示,并可搜索压缩文件。

grep -r 相比,rg 在大型代码库中的搜索速度通常快数倍至一个数量级。它默认启用正则表达式,并会自动跳过隐藏文件及二进制文件。

常用选项与示例

1
2
3
rg "function_name"        # 递归搜索当前目录
rg -t py "import" # 仅搜索 Python 文件
rg -l "TODO" # 仅列出包含匹配内容的文件名

同名替换?不能
rg 并不完全兼容 grep 的所有选项(例如 -P 启用 Perl 兼容正则表达式,或某些输出格式控制选项)。许多现有脚本依赖 grep 的特定返回码或输出格式,直接替换可能导致意外行为。建议将 rg 作为独立工具使用。

仓库位置: https://github.com/BurntSushi/ripgrep


2. fd —— 用户友好的文件查找工具

替换目标find
核心优势 :语法更简洁,默认忽略隐藏文件和 .gitignore 中指定的文件,输出彩色高亮,支持正则表达式。

相比 find 的复杂谓词组合,fd 采用直觉化的参数设计,例如 fd pattern 即可完成递归文件名匹配。

常用选项与示例

1
2
3
fd source                 # 查找路径下匹配 source 的文件
fd -e rs # 查找所有 .rs 文件
fd -t d "src" # 查找名为 src 的目录

同名替换? ⚠️ 谨慎,仅限交互式
find 的参数体系与 fd 完全不同,且大量自动化脚本依赖 find-exec-print0 等特性。强行设置 alias find='fd' 会破坏这些脚本。建议将 fd 作为独立工具使用。

仓库位置: https://github.com/sharkdp/fd


3. eza —— 现代化的 ls 替代

替换目标ls 核心优势 :支持图标显示、树形视图、Git 状态标识,并可按文件扩展名排序。

eza 在输出中包含文件类型图标、每个文件的 Git 修改状态(例如 M 标记),并以不同颜色区分文件类型,显著提升了目录列表的可读性。

exa 项目已归档,不再推荐,eza 为其活跃分支。

常用选项与示例

1
2
3
eza -l --git              # 显示详细信息及 Git 状态
eza -T -L 2 # 以树形结构显示两层目录
eza --icons --sort=size # 按文件大小排序并显示图标

同名替换? ⚠️ 谨慎,仅限交互式
ls 是 POSIX 标准定义的基本命令,许多脚本会解析其输出(例如通过管道获取列信息)。虽然 eza 实现了 ls 的大部分常见选项,但输出格式(如颜色代码、额外的 Git 列)可能破坏脚本逻辑。安全做法是仅在交互式配置中设置 alias ls='eza',并避免在脚本中使用该别名。

当然,更安全的做法依然是以独立工具使用。eza 对小拇指不友好,可以设置额外的一些别名:

1
2
3
4
5
6
if command -v eza &> /dev/null; then 
alias l='eza'
alias ll='eza -l'
alias la='eza -a'
alias lt='eza --sort=time -l'
fi

仓库位置: https://github.com/eza-community/eza


4. difftastic —— 基于语法树的差异对比

替换目标diff
核心优势 :解析源代码的抽象语法树(AST),从结构层面展示差异,而非逐行比较。

difftastic 能够识别括号匹配、缩进变化等结构性修改,避免了传统 diff 因格式化变动而产生的大量无效差异。支持多种编程语言,输出带有侧边栏和可折叠区域的界面。

常用选项与示例

1
2
difft left.c right.c          # 对比两个文件
difft --display inline # 使用行内显示模式

它同样可以用于 git diff,效果很显著。由于它懂语法,所以在展示代码修改差异时,可读性更强。

1
2
git config --global diff.external "difft --syntax-highlight off"
# 我喜欢把语法高亮关闭,有点干扰显示

有个缺点是,它需要分析语法树,所以在性能方面,比原生 diff 要慢,在打开大文件时会比较明显有延迟。

同名替换? ⚠️ 谨慎,仅限交互式
diff 的退出码和输出格式被广泛用于自动化流程(例如 patch 工具、CI 脚本),而 difftastic 专为人工审阅设计,不具备兼容性。建议将 difft 作为独立工具使用。

仓库位置: https://github.com/Wilfred/difftastic


5. zoxide —— 智能目录跳转

替换目标cd 核心优势 :基于频率和最近使用时间记录访问过的目录,支持模糊匹配快速跳转。

使用 z 命令后跟部分目录名,即可直接跳转到匹配的目标目录,无需输入完整路径。zoxide 会维护一个本地数据库,自动更新访问权重。

常用选项与示例

1
2
z src                     # 跳转到包含 "src" 的最常用目录
z foo bar # 多个匹配时显示交互式选择菜单

如果配合 fzf,可以实现打开交互式窗口来选择性跳转,也挺有意思的,不过我不怎么用。fzf 是一个高性能的模糊匹配工具,也很不错,但它不属于可替换原生终端程序的范畴,我便没有列在本文中。

同名替换?尽量不要 cd 是 shell 内建命令,直接影响当前 shell 的进程工作目录。zoxide 虽然可以与 cd 配合使用,但无法完全模拟 cd -(返回上一目录)或 cd "$VAR" 等行为。建议将 z 作为独立工具使用。

仓库位置: https://github.com/ajeetdsouza/zoxide


6. htop —— 增强型进程监控器

替换目标top
核心优势 :彩色界面、鼠标支持、树状进程视图、可直接发送信号,并显示每个 CPU 核心的使用率。

htop 允许用户使用上下键滚动进程列表,按 F9 快速终止进程,按 F5 切换树状视图,比 top 的默认交互更为直观。

常用选项与示例

1
2
3
htop                      # 启动交互式监控
htop -t # 以树形结构显示进程
htop -p 1234,5678 # 仅监控指定的 PID

同名替换? ⚠️ 仅限交互式,不适合脚本
top 的批处理模式(-b)常被脚本用于采集系统信息,而 htop 不支持该模式。因此可以在交互环境中设置 alias top='htop',但不应在 .bashrc 等全局配置中覆盖,以免影响自动化任务。

仓库位置: https://github.com/htop-dev/htop


7. axel —— 多线程下载工具

替换目标wget / curl(下载文件场景)
核心优势 :通过多个连接分段下载同一文件,可显著提升下载速度(尤其在网络延迟较高或服务端限速时)。

axel 会将目标文件切分为多个部分并行获取,最后自动合并。它支持断点续传和限速功能。

常用选项与示例

1
2
3
axel -n 10 -o ./file.zip "https://example.com/bigfile.zip"   # 10 线程下载
axel -a # 显示详细进度
axel --limit-speed=100K # 限制速度为 100KB/s

同名替换?完全不能
wgetcurl 拥有极其丰富的参数体系(HTTP 头、Cookie、POST 数据等),axel 仅覆盖最简单的下载场景。不应尝试替换,而是将其作为补充工具使用。

仓库位置: https://github.com/axel-download-accelerator/axel


8. bat —— 带语法高亮的文件查看器

替换目标cat
核心优势 :自动识别文件类型并添加语法高亮,集成 Git 行级修改标记,默认使用分页器(less)避免刷屏。

bat 在显示代码文件时,会在行号旁标注 Git 的增删状态,并提供与 IDE 类似的色彩方案。

常用选项与示例

1
2
3
bat main.rs               # 高亮显示 Rust 代码
bat -A config.json # 显示不可见字符(类似 `cat -A`)
bat -p # 禁用所有增强特性,模拟纯 `cat`,但仍包含语法高亮

同名替换? ⚠️ 部分可行,但有风险
bat 的输出被重定向到管道时,它会自动关闭分页和高亮,行为接近 cat。但它仍可能输出额外的元信息(如默认的文件头)。需要谨慎考虑是否替换。

仓库位置: https://github.com/sharkdp/bat


9. tldr —— 简化的命令示例手册

替换目标man(仅限快速查阅常用用法)
核心优势 :提供社区维护的常见命令示例,每个命令通常包含 4–6 个典型场景,避免翻阅冗长的手册页。根据系统语言还能自动显示不同的翻译版本(比如中文)。

tldr 适合快速回忆参数格式,例如 tldr tar 会直接显示压缩和解压的常用命令。每个工具的示例描述都是网友手工维护的,如果没有你想要的工具,也可以到仓库去提交。

常用选项与示例

1
2
3
tldr tar                  # 显示 tar 命令的常见示例
tldr --update # 更新本地示例缓存
tldr -p linux dd # 显示 Linux 平台下的 dd 示例

同名替换?完全不能
man 提供完整的结构化文档及 man -k 关键词搜索功能,tldr 无法覆盖这些用途,它们的选项也完全不同。两者属于是同一功能的不同实现。简单查询可以用 tldr,如果想完整了解一个工具,依然得打开 man

仓库位置: https://github.com/tldr-pages/tldr

一个 Rust 实现的客户端: https://github.com/dbrgn/tealdeer


10. dua —— 交互式磁盘使用分析器

替换目标du
核心优势 :更实用的展示路径下各文件和目录的磁盘使用量。它是并发统计的,所以性能更好,显示也更人性化。

常用选项与示例

1
2
dua                       # 统计当前路径下的磁盘使用量
dua * # 只统计非隐藏文件和路径的磁盘使用量

同名替换?完全不能
du 的输出经常被脚本解析(例如 du -k | cut -f1),两者是完全不同的交互实现。请将 dua 作为独立的分析工具使用。

仓库位置: https://github.com/Byron/dua-cli


11. duf —— 改进的磁盘空间查看器

替换目标df
核心优势 :使用进度条和颜色区分不同设备类型(本地磁盘、挂载点、临时文件系统),支持 JSON 输出。

duf 会自动分组显示设备,并用绿色到红色的渐变表示使用率,便于快速识别磁盘占用过高的分区。

常用选项与示例

1
2
3
duf                       # 显示所有挂载点
duf --only local # 仅显示本地磁盘
duf --output mountpoint,size,used # 仅输出指定列

同名替换?完全不能
df 的 POSIX 兼容输出格式(-P 选项)被许多运维脚本依赖,而 duf 的输出结构与之不同,所以不要同名替代 df。请直接使用 duf 作为磁盘统计工具使用。

仓库位置: https://github.com/muesli/duf


总结:工具的演进与选择策略

上述工具在特定场景下显著提升了终端操作效率,但它们并非完全兼容 POSIX 标准命令。因此在实际使用中,建议采取以下策略:

  • 交互式环境 :可以自由设置 alias 指向这些现代工具,享受更丰富的功能和更好的用户体验。
  • 编写脚本 :坚持使用系统原生命令(如 /bin/grep/bin/find),或通过绝对路径调用,以确保可移植性和可预测的行为。
  • 持续关注 :工具生态不断进化,今天优秀的替代品未来可能被更优的实现取代。保持开放心态,定期评估新工具,但始终以兼容性和稳定性为前提。

命令行世界没有“终极”工具,只有不断适应需求演进的实用方案。合理利用这些现代终端工具,可以在不牺牲可靠性的前提下,大幅提升日常开发与运维的舒适度。


本文同步发布在知乎账号下:汇总几个终端小工具

标题图片使用豆包 AI 生成,提示词:终端窗口、黑色背景、涂色画板、毛笔、16:9 画幅。