Rust 写的小工具之 eza:ls 的现代替代品

lxiol

从 exa 到 eza:一个 fork 接力故事

eza 是一个用 Rust 编写的命令行工具,GitHub 首页给自己的定位只有一句话:A modern replacement for ls(ls 的现代替代品)。截至本文编写时(2026 年 7 月),eza 在 GitHub 上约有 22.7K Star,分叉自 486 个仓库,项目创建于 2023 年 7 月,最新稳定版本 v0.23.5,许可证 EUPL-1.2

要讲 eza,必须先讲它的前身 exa

  • 2014 年,开发者 ogham 创建 exa,一度是 Rust 社区最知名的终端工具之一,Star 数超过 24K
  • 最早实现彩色 ls、Git 集成、树形视图,在当时相当超前
  • 2021 年之后陷入停滞——最后一次 release 停在 2021 年,遗留几个关键 bug 一直没修,最有名的就是 “The Grid Bug”(网格视图渲染问题)

eza 不是从零重写,而是社区接力的结果。eza-community 于 2023 年 7 月 fork exa,目标明确:修复 exa 存在的问题、合并社区积累的 PR、继续推进新功能。两年下来,eza 不仅修复了 Grid Bug 和安全漏洞,还新增了超链接支持、图标显示、Selinux 上下文、Git 仓库状态、自定义主题配置文件等一系列 exa 没有的能力,Star 数已接近 exa 且仍在快速增长。

起点:ls 够用,但信息密度可以更高

ls 足够成熟、稳定、任何 Linux/macOS 机器都有,但也活得足够久——久到很多”应该更好”的体验被默认接受了:

场景 ls 能做什么 不够顺手的地方
看目录 列出文件名 文件类型全靠颜色区分,不够直观
看详情 ls -l 显示权限、大小、时间 时间格式固定,大小单位不明确
看树形 需要 tree 命令 额外装工具,输出格式不统一
Git 状态 需要 git status 不能和 ls 输出合并

传统 ls 的问题不是”不能做到”,而是”需要你记得把好几件事拼在一起”:想看目录树要装 tree,想看 Git 状态要切回 git status,想看文件类型要再查 file。每件事都不复杂,但每天做几十次,累积的摩擦不小。eza 做的事情很直接:把这些本应合并的信息,在一行输出里全部呈现出来。

eza 具体解决了什么

eza 没有惊天动地的创新,而是在 ls 这个最普通的命令上积累了一整套提升信息密度的改进:

1. 颜色 + 图标:一眼分辨文件类型

默认用颜色区分文件类型(普通文件、目录、链接、可执行文件各有不同颜色);配合 --icons 选项和 Nerd Font 字体,每个文件前面显示对应图标(📄📁🔗⚙️ 等)。这不是装饰而是信息辅助:目录文件很多时,文字还没看,图标已经把类型信息传给你了。

2. Grid Bug 修复:网格视图不再错乱

exa 从 2021 年开始存在网格视图渲染 bug:当文件列表包含宽字符(中文、日文、emoji)时列对齐错乱,文件名跨列、重叠,输出完全无法阅读。这个 “The Grid Bug” 在 exa 的 issue 列表挂了一年多无人修复,是 eza fork 之后第一批重要工作之一。

3. Git 集成:ls 和 git status 不再分家

  • --long 模式下加 --git:输出里直接看到每个文件的 Git 状态(已修改、已暂存、未跟踪、被忽略),不用另跑 git status
  • 进阶的 --git-repos:列出每个子目录的 Git 仓库状态,对 monorepo 或多 Git 仓库的项目结构非常实用
  • --hyperlink:每个文件名变成可点击的超链接(新终端如 iTerm2、kitty、Warp 支持),点击直接打开文件
  • --time-style:时间格式可选 isolong-isofull-isorelative,甚至自定义 +%Y-%m-%d %H:%M

5. 自定义主题:theme.yml 彻底定制输出

支持 theme.yml 配置文件,自定义不同文件类型的颜色和图标;官方维护 eza-themes 仓库,可直接下载社区主题。配置里不仅能设定 LS_COLORSEXA_COLORS 环境变量中的选项,还能指定不同文件扩展名的图标——对默认配色不满,几分钟就能调出一套自己的视觉风格。

不只是”彩色 ls”

能力维度 ls exa(旧) eza
文件图标 ✅ 支持
超链接 ✅ 支持
Grid Bug 修复 N/A 未修复 ✅ 已修复
Git 仓库状态 有限 ✅ 完整
自定义主题 环境变量 ✅ theme.yml
颜色渐变 固定色 ✅ 支持 gradient

eza 没有推翻 ls 的接口,而是兼容大部分常用选项,额外提供 --icons--hyperlink--git-repos--color-scale 等全新能力,可以直接 alias 成 ls,几乎不破坏脚本兼容性。

典型用法

1
2
3
4
5
6
7
8
eza -l --git                    # 长格式 + Git 状态
eza -T --level=3 # 树形视图,3 层深度
eza -l --icons --color-scale # 图标 + 颜色渐变
eza -l --hyperlink --time-style=relative # 超链接 + 相对时间

# alias 替代 ls
alias ls='eza'
alias ll='eza -l --icons'

哪些人会明显受益

  • 每天用 ls 上百次的人:默认操作值得一次升级
  • 项目结构复杂、目录层级深的人:树形视图 + Git 状态非常实用
  • 终端使用 Nerd Font 的人:图标让目录浏览体验提升明显
  • 维护 monorepo 或多仓库的人--git-repos 一站式查看子目录 Git 状态
  • 曾经用过 exa、因项目停滞而离开的人:eza 已经接回来了,而且做得更好

反过来说,如果你只是偶尔开终端、主要工作在 IDE 里完成,eza 对你更像”锦上添花”而非”雪中送炭”。

边界:它不是万能工具

  • 图标需要终端使用 Nerd Font,否则图标会显示为乱码
  • eza 不是 ls 的逐字替代品——大部分常用选项兼容,但某些极低级别的行为略有差异
  • 部分发行版上可能需要额外配置,才能让 alias 完全替换 ls 而不破坏脚本
  • 社区非常活跃、版本迭代快,但 API 在后向兼容上总体控制得不错

结论:它属于”增强型”工具

回顾这个系列前三期:Atuin 补的是命令历史,bat 补的是文件阅读,eza 补的是目录感知。共同特点不是创造全新工作流,而是把一个每天都在做的动作做得更顺手、更有信息量。

eza 的故事还多一层价值:它证明了当一个优秀的开源项目搁浅时,社区有能力接手、修复、继续发展。从 exa 到 eza 不是一次简单的 fork,而是一次完整的项目接力——22.7K Star 的回报说明这个方向是对的。

打开终端做的第一件事往往就是 ls。当你把这个最普通的操作升级了,整个终端体验都会跟着变好。

  • 🔗 GitHub:github.com/eza-community/eza
  • 🎨 支持图标、超链接、Git 集成、自定义主题
  • 🦀 Rust 编写,EUPL-1.2 License
  • ⬆️ 从 exa(24K Star)fork 而来,现已趋于超越

本文写于 2026 年 7 月,项目信息基于 eza 官方 README、GitHub 仓库与发布记录。系列《Rust 写的小工具》第 3 期:eza。

  • 标题: Rust 写的小工具之 eza:ls 的现代替代品
  • 作者: lxiol
  • 创建于 : 2026-08-06 00:00:00
  • 更新于 : 2026-08-06 14:01:48
  • 链接: https://blog.lxiol.cn/2026/08/06/rust-tool-eza-ls-replacement/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。