Very few command-line tools earn a permanent alias. I install a new one most weeks, use it hard for a few days, and quietly let it fall out of my muscle memory because the old thing was fine. ls is about as old and as fine as a command gets, which makes it a brutal thing to replace. So when I tell you that eza has been aliased over ls in my dotfiles for months and I have never once missed the original, understand that is a high bar cleared, not faint praise.
I came to eza the same way a lot of people did: I had used exa years ago, loved the git columns, and then watched the project go quiet and unmaintained. eza is the community fork that picked up where exa stopped, and it is now the actively developed one. This is the review of what it actually does, the one alias that makes it click, and the honest places where it is not a perfect drop-in.
What eza Is
eza replaces ls. You run it in place of ls and it lists the directory, except the output is more useful and much easier to read. Underneath that one-line description:
- It is written in Rust, the binary is small, and it starts instantly.
- The long listing understands git. Add the git flag and you get a column showing which files are modified, staged, or untracked, right next to the permissions and size.
- It has a genuinely good built-in tree mode, so you stop installing the separate
treeutility. - Its default colors and optional file-type icons are readable, not the eye-searing rainbow some tools ship.
- It is a maintained fork of exa, so unlike exa it is still getting fixes and releases.
If you have used exa, eza is exa that kept going. If you have not, think of it as ls with the three features you always wished ls had bolted in: git awareness, a real tree, and colors that help instead of shout.
Installation
On macOS it is one line:
brew install eza
On most Linux distributions it is in the package manager as eza, and if not, cargo installs it from crates.io. That is the whole install. There is no daemon, no config file you must write, and no shell integration required to get value on the very first run.
If you want the file-type icons, you need a Nerd Font installed and selected in your terminal. Without one, the icon flag prints placeholder boxes instead of glyphs. This trips up a lot of first-timers, so if your icons look broken, the font is the reason, not eza.
The Aliases That Make It Click
Here is the config that turned eza from a tool I ran occasionally into the one my fingers reach for automatically. It is two aliases in my shell rc:
alias ls='eza --group-directories-first --icons=auto'
alias ll='eza -l --git --group-directories-first --icons=auto'
The first line makes plain ls an eza call with directories grouped first and icons on when the terminal supports them. The second makes ll a long listing with the git column turned on. That git column is the feature. Every time I list a directory inside a repo, I see at a glance which files are dirty, staged, or untracked, without running a separate git status. That small merge of two commands into one is the thing I did not know I wanted until I had it, and now its absence on a fresh machine feels like a missing tooth.
I also keep a tree alias:
alias lt='eza --tree --level=2 --git-ignore'
The --git-ignore flag makes the tree respect your .gitignore, so it does not drown you in node_modules. A two-level tree that already knows to hide the junk is exactly the view you want when you drop into an unfamiliar project.
What Makes eza Better Than ls in Daily Use
The git integration is the headline, but the quality-of-life details are what keep it aliased. Human-readable sizes are on by default in the long view, so you read megabytes instead of counting digits. The color coding distinguishes directories, executables, symlinks, and broken symlinks clearly, and a broken symlink is loudly obvious instead of hiding in a wall of text. Directories group first, so the listing has a shape your eye can scan.
The tree mode deserves its own line of praise, because it quietly retired a separate tool for me. I used to install tree on every machine. eza’s --tree does the same job, respects gitignore, colors consistently with the rest of my listings, and takes a depth limit, so I deleted tree from my setup notes and never looked back. Consolidating two tools into one you already have is a real win when you provision new machines often.
None of these are revolutionary on their own. Together they add up to a listing command that gives you more signal per glance than ls does, and once your eyes adjust to that density of information, going back feels like squinting.
Where eza Falls Short
I told you this is an honest review, so here are the real cons.
It is not a perfect drop-in for GNU ls. eza covers the flags you use interactively, but it is not one hundred percent compatible with every GNU ls option, and a handful of scripts that parse ls output or depend on an exact flag will want the real binary. This is why I alias ls to eza for my interactive shell but never assume scripts use my aliases. Scripts call the actual ls on the path, which is correct. If you find yourself wanting eza inside a script, call eza explicitly rather than leaning on the alias.
The icons need a Nerd Font. This is not really eza’s fault, it is how terminal glyphs work, but it is the single most common first-run complaint and worth stating plainly. Install a Nerd Font, select it in your terminal, and the boxes become icons. Or just turn icons off and lose nothing important.
And there is the eternal cost of every one of these modern replacements: it is one more thing to install on every machine and carry in your dotfiles. I have made peace with that because eza earns its slot, but if you are the kind of person who wants a laptop to work with nothing but the base system, that friction is real. This is the same trade-off I weighed in my writeups of zoxide and atuin: a small permanent maintenance tax in exchange for a daily quality-of-life gain. For eza, the gain clears the tax easily.
How It Fits With the Rest of the Modern CLI
eza is one piece of a set of Rust-era replacements that individually are small and together reshape the terminal. I pair it with zoxide for jumping between directories, a fuzzy finder for filtering, and a better cat for syntax-highlighted file viewing. eza is the one that owns the moment you arrive in a directory and want to know what is here and what has changed. It sits at the front of that workflow, and because it is git-aware, it often answers the question that would otherwise send me to git status a beat later.
That composability is the point. None of these tools try to take over your shell. They each do one classic job better and then get out of the way, and eza is a model citizen of that philosophy.
A Few Flags Worth Knowing
Beyond the aliases, a handful of eza flags are worth committing to memory because they turn up constantly. The header flag prints a labeled row above the long listing, which is handy when you are showing output to someone who does not live in a terminal. The sort flags let you order by size, by modified time, or by extension, so finding the biggest file or the most recently touched one is a single option instead of a pipe into sort. The all flag shows dotfiles, same as ls -a, and combines cleanly with everything else.
My favorite lesser-known one is the flag that shows extended attributes and file times together, which turns a listing into a quick audit of when things changed without opening another tool. None of these are things you need on day one, but they are the reason eza keeps rewarding you the longer you use it. It has depth without demanding that you learn it up front, which is exactly how a good replacement for a decades-old command should behave.
The Bottom Line
eza is the rare ls replacement that survives past the first week, and in my dotfiles it has survived months. The git status column and the built-in tree mode alone justify aliasing it, and the readable colors and human sizes are the kind of small daily wins you stop noticing precisely because they are always there helping. It loses half a star only for the imperfect GNU compatibility and the Nerd Font requirement, neither of which has ever actually gotten in my way.
If you spend your day in a terminal and still run plain ls, install eza, drop the two aliases above into your shell rc, and give it a week. The git column will hook you first. After that, listing a directory without knowing what is dirty in it will feel like working with one eye closed. It is free, it is fast, it is maintained, and it is the easiest upgrade to your terminal you will make this year.