Rust 写的小工具之 eza:ls 的现代替代品
从 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 仓库的项目结构非常实用
4. Hyperlink + 自定义时间格式
--hyperlink:每个文件名变成可点击的超链接(新终端如 iTerm2、kitty、Warp 支持),点击直接打开文件--time-style:时间格式可选iso、long-iso、full-iso、relative,甚至自定义+%Y-%m-%d %H:%M
5. 自定义主题:theme.yml 彻底定制输出
支持 theme.yml 配置文件,自定义不同文件类型的颜色和图标;官方维护 eza-themes 仓库,可直接下载社区主题。配置里不仅能设定 LS_COLORS 和 EXA_COLORS 环境变量中的选项,还能指定不同文件扩展名的图标——对默认配色不满,几分钟就能调出一套自己的视觉风格。
不只是”彩色 ls”
| 能力维度 | ls | exa(旧) | eza |
|---|---|---|---|
| 文件图标 | 无 | 无 | ✅ 支持 |
| 超链接 | 无 | 无 | ✅ 支持 |
| Grid Bug 修复 | N/A | 未修复 | ✅ 已修复 |
| Git 仓库状态 | 无 | 有限 | ✅ 完整 |
| 自定义主题 | 无 | 环境变量 | ✅ theme.yml |
| 颜色渐变 | 无 | 固定色 | ✅ 支持 gradient |
eza 没有推翻 ls 的接口,而是兼容大部分常用选项,额外提供 --icons、--hyperlink、--git-repos、--color-scale 等全新能力,可以直接 alias 成 ls,几乎不破坏脚本兼容性。
典型用法
1 | eza -l --git # 长格式 + Git 状态 |
哪些人会明显受益
- 每天用 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 进行许可。