现代 CLI 替代品:bat / eza / sd / dust / procs / duf

起因

cat / ls / sed / du / ps / df 用了几十年。够用,但:

  • 默认输出朴素,看不出结构
  • 性能没跟上多核 CPU
  • 选项 / 标志难记

Rust / Go 写的现代替代品,默认就好用

干啥
cat bat 查看文件 + 高亮
ls eza (前 exa) 列目录 + 图标 + git status
sed sd 简单替换
du dust 磁盘占用 visualization
df duf 磁盘空间分区
ps procs 进程列表
find fd 文件搜索
grep rg 文本搜索
top btop 系统监控
tldr tealdeer man 替代(例子)

下面挨个看。

bat (cat 替代)

brew install bat
$ bat README.md
  • 语法高亮(300+ 语言)
  • 显示行号
  • 长文件自动 pager(按 q 退)
  • git diff 标记(左侧 +/-)
bat -p file.json         # 不要 pager / 行号
bat -A file.txt          # 显示空白字符(debug 缩进)
bat --diff               # diff 高亮

alias:

alias cat='bat -p'              # 当 cat 用
alias less='bat'                # 当 pager 用

vim 类似 less 但更好。

eza (ls 替代)

brew install eza
$ eza -l --icons --git
.rw-r--r-- u  1.2K  Mar 14 10:23  README.md
.rw-r--r-- u   234  Mar 14 10:25  package.json     M
drwxr-xr-x u     -  Mar 14 10:25  src              -- 1
  • 颜色按文件类型
  • NerdFont 图标
  • git status 集成
  • tree 模式:eza --tree

我的 alias:

alias ls='eza --group-directories-first'
alias ll='eza -l --icons --git'
alias lt='eza --tree -L 2'
alias la='eza -la --icons'

sd (sed 替代)

brew install sd
cargo install sd

简单替换,语法直觉:

# sed
sed -i 's/foo/bar/g' file.txt

# sd
sd 'foo' 'bar' file.txt
  • 默认 PCRE regex(不像 sed POSIX)
  • 不用 \(\),用 ()
  • 不用 escape /
  • 默认 in-place
sd 'class (\w+)' 'struct $1' src/*.rs       # 替换 + capture group
sd -p 'foo' 'bar' file.txt                   # preview 不写

sed 仍胜的场景:复杂 stream editor(s/// + d + p 命令组合)。
90% 简单替换 → sd。

dust (du 替代)

brew install dust
$ dust
 9.0G   ┌── node_modules
14.0G ┌─┴ project_a
 5.0G ┌─┴ projects
24.0G  /home

ASCII 树 + 大小条 + 自动按大小排序。比 du -sh * | sort -h 直接。

dust -d 3            # 深度 3
dust -n 30           # 显前 30 大
dust -X .git         # 排除

duf (df 替代)

brew install duf
╭────────────────────────────────────────────────────────────────╮
│ 3 local devices                                                │
├──────────────┬──────────┬────────┬─────────┬───────┬───────────┤
│ MOUNTED ON   │     SIZE │   USED │   AVAIL │ USE%  │ FILESYS   │
├──────────────┼──────────┼────────┼─────────┼───────┼───────────┤
│ /            │ 466.0 GB │ 200 GB │  246 GB │  [████░░░░░░] 45% │
│ /boot/efi    │ 100.0 MB │  30 MB │   70 MB │  [████░░░░░░] 31% │
╰──────────────┴──────────┴────────┴─────────┴───────┴───────────╯

彩色 bar + 按 mount point 分组。df 的丑表格再见。

procs (ps 替代)

brew install procs
$ procs node
 PID:    1234   USER: alice   CPU: 12.3%   MEM: 234MB
   START: 10:23   STATE: Sleeping   CMD: node server.js

彩色 + 友好单位 + tree mode:

procs --tree
procs --sortd cpu      # 按 CPU 降序

btop (top / htop 替代)

brew install btop

GUI-like TUI 监控,键盘鼠标都能用。比 htop 更现代。

╔═CPU═══════════════════════╗  ╔═MEM═════════════╗
║ 1 ███████████░░  56%      ║  ║ Total  16.0 GB  ║
║ 2 ████░░░░░░░░░  22%      ║  ║ Free    3.2 GB  ║
║ 3 ███░░░░░░░░░░  15%      ║  ║ Cached  4.5 GB  ║
║ 4 ██░░░░░░░░░░░  10%      ║  ╚═════════════════╝
╚═══════════════════════════╝

tldr (man 替代,例子)

brew install tealdeer        # Rust 实现,比 nodejs 版快
$ tldr tar

  tar - Archiving utility.

  - Create an archive from files:
    tar -cf path/to/target.tar path/to/file1 path/to/file2

  - Extract:
    tar -xf path/to/source.tar

  - List contents:
    tar -tvf path/to/source.tar

5 个常用例子,不像 man 一屏密密麻麻看不进去。

我的 .zshrc 完整 alias 块

# Modern CLI replacements

# cat → bat
command -v bat &>/dev/null && alias cat='bat -p'

# ls → eza
if command -v eza &>/dev/null; then
    alias ls='eza --group-directories-first'
    alias ll='eza -l --icons --git'
    alias la='eza -la --icons --git'
    alias lt='eza --tree -L 2'
fi

# find → fd
command -v fd &>/dev/null && alias find='echo "use fd";'

# grep → rg
# (don't alias, keep grep for scripts)

# du → dust
command -v dust &>/dev/null && alias du='dust'

# df → duf
command -v duf &>/dev/null && alias df='duf'

# ps → procs (for human use, scripts keep ps)
# don't alias

# top → btop
command -v btop &>/dev/null && alias top='btop'

不替代 / 谨慎替代

  • grep:很多 script 用 grep -E 之类,alias rg 会破。手动用 rg
  • find:很多 script 用 find -exec,alias fd 会破。
  • ps:进程间通信 / script 解析常用 ps 的 well-known column 输出。
    不要 alias。
  • sed:stream pipeline 中 sed 仍最广。

人交互用新 / script 用老。alias 加 if [[ -t 1 ]] 检查 tty,
避免 pipeline 触发。

一次性试

不想 alias 永久 → 装了直接调名字:

$ bat file.md
$ eza -l
$ dust

朴素需求老命令、想要好看 / 信息多用新工具。

性能 / 资源

这些 Rust / Go 工具普遍比传统 C 实现快 1.5-5x。
启动开销小(无 JVM 之类)。
单 binary 没 dep,下个 portable 文件就跑。

踩过的坑

  1. NerdFont 字符方块:eza --icons 显示乱码 → 终端字体没装
    NerdFont。

  2. CI 没装替代品:本地 alias find=fd 习惯后写 script find → CI 报错。
    alias 只在 interactive shell 加。

  3. eza 旧版叫 exa:教程到处写 exa,已 abandoned 改 eza。fork 后
    保持兼容。

  4. bat 没装 themes:默认 monokai。喜欢 dracula / nord 等 →
    bat --list-themes + bat --theme=Dracula file

  5. 远程 server 没装:ssh 上去 alias 不在。要么 dotfiles 同步 +
    ssh 自动装。

精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。