TopGit
GitHub Repo Review

exa: the exa ls replacement for Unix (unmaintained)

ogham/exa
ETopGit review image for ogham/exa
Review by Topgit.dev for ogham/exa, with GitHub repository stats and README context.
Quick verdict

exa is dead in the sense that matters: no one merges PRs into ogham/exa anymore, and the README says so on line one, pointing straight at the eza fork. What's left still works as a drop-in ls replacement, with colors, Git status, and tree view, but it's frozen code while eza keeps shipping fixes. Install exa only if a script already depends on the exact binary; for daily use, eza is the same tool minus the abandonment risk.

Stars
★ 24.4k
Forks
⑂ 655
Contributors
👥 163
Language
Rust
License
MIT
Topic
Developer Tools
Updated
Sep 2024
Homepage
GitHub

What is exa?

exa is a single Rust binary that replaces the Unix `ls` command, adding colored output, icons, and awareness of symlinks, extended attributes, and Git status that stock ls doesn't show. It reads the same directories ls does but formats them as a grid by default, or as one-line, long, or tree layouts on request. exa itself stopped receiving updates, though, and its own README points users to the eza fork for anything beyond a quick look.

Key features: colors, Git status, and tree views

  • Git-aware long view: `--git` in `-l` mode marks each file as modified, new, or ignored straight from the working tree, something `ls` has no concept of.
  • Tree recursion built in: `-T`/`--tree` walks subdirectories and prints them as a tree without piping through `find` or a separate tree binary.
  • Extended attributes: `-@`/`--extended` lists each file's xattrs and their sizes, useful for checking things like quarantine flags on macOS.
  • Color-scaled sizes: `--color-scale` shades file sizes so large files stand out in a long listing instead of reading as plain numbers.
  • Type indicators and icons: `-F`/`--classify` appends a symbol for the file type, and `--icons` adds file-type icons in terminals that support them.
  • Flexible sorting and filtering: `--sort`, `--group-directories-first`, `--git-ignore`, and glob-based `--ignore-glob` control what shows up and in what order without extra shell plumbing.
How this repository's GitHub stars have grown over time. Source: star-history.com.View the star history

Installing exa on your system

exa ships from most Unix package managers: `apt install exa` on Debian and Ubuntu 20.10+, `pacman -S exa` on Arch, `dnf install exa` on Fedora, `brew install exa` on macOS via Homebrew, `port install exa` via MacPorts, `apk add exa` on Alpine, `zypper install exa` on openSUSE, `emerge sys-apps/exa` on Gentoo, `xbps-install -S exa` on Void, `nix-env -i exa` on NixOS, and `pkg install exa` on Termux/Android. With a Rust toolchain already set up, `cargo install exa` builds it from crates.io and drops the binary in `$HOME/.cargo`; add `--no-default-features` to skip the libgit2 dependency if you don't need Git status. Manual installs can grab a compiled binary from the GitHub releases page and copy it into a directory on `$PATH`, like `/usr/local/bin`.

Using exa's command-line options

The default view is a colored grid (`-G`); switch to one entry per line with `-1`, or add `-l` for a long view with permissions, size, and timestamps. Add `-T` to recurse as a tree, or `-R` to recurse without the tree formatting, and `-L 2` to cap recursion depth. `-a` shows dotfiles (pass it twice to also show `.` and `..`), and `--git-ignore` drops anything matched by `.gitignore`. Inside `-l`, `--git` adds a Git-status column, `-@` shows extended attributes, and `-h` adds a header row; `--time=modified` (or `changed`/`accessed`/`created`) picks which timestamp populates the time column, and `--sort=size` or `--sort=type` changes the ordering.

Strengths

  • Single binary, no shell functions or aliases to maintain across machines.
  • Git status baked into the long view, saving a separate `git status` call during quick directory checks.
  • Packaged in most major distro repos and Homebrew, so installation is a one-line command on most systems.
  • Sensible colored defaults out of the box instead of requiring `LS_COLORS` configuration.

Limitations of exa

  • The project is unmaintained: the README states the repo can't even be archived because the one person with the rights to do it is unreachable, so open issues and PRs sit untouched.
  • Building with Git support requires libgit2, and users on musl targets need the `vendored-openssl` feature flag to get it working — a build step a maintained project would likely have smoothed out by now.
  • Every packaged distro build is frozen at whatever version was last released; there's no path to newer fixes short of switching to eza.
  • The manual page build depends on pandoc, an extra external tool most users won't already have installed just to read `man exa`.

Alternatives to exa

eza — the actively maintained fork of exa, same core feature set (colors, Git status, tree view) plus fixes and features added since exa stopped.lsd (LSDeluxe) — another Rust ls replacement with icons and colors, a similar pitch to exa's but under active development.The standard `ls` with shell aliases — `alias ll='ls -alFh --color=auto'` gets some of the colored, detailed output without adding a dependency.

Frequently asked questions about exa

Is exa still maintained or should I use eza instead?

exa is not maintained — its own README says so and points to eza, a community fork that continues to add features and fixes exa stopped receiving. For any new setup, eza is the safer choice; exa still runs, but bugs and gaps found now won't get patched in this repo.

How do I install exa on Ubuntu, macOS, or from Cargo?

On Ubuntu 20.10 or later, run `sudo apt install exa`. On macOS with Homebrew, run `brew install exa`. With a Rust toolchain installed, `cargo install exa` builds it from crates.io; add `--no-default-features` to skip the Git-support dependency if you don't need it.

What is the difference between exa and the standard ls command?

exa adds colored output by default, a grid layout instead of plain columns, Git status in the long view, tree recursion with `-T`, extended-attribute listing, and a color scale for file sizes — none of which stock `ls` provides without extra flags or wrapper scripts.

Does exa show Git status and file changes in the listing?

Yes, exa shows Git status: passing `--git` alongside `-l` (long view) adds a column marking each tracked file as modified, new, or ignored based on the current working tree, right in the file listing.

Can I use exa with tree view and icons on any Unix system?

exa's tree view (`-T`) and `--icons` flag work anywhere the exa binary runs, including Linux, macOS, and Android/Termux — icon rendering just depends on your terminal font supporting the glyphs exa outputs.

What Rust version do I need to build exa from source?

Building exa from source needs Rust version 1.66.1 or higher, installed via rustup, plus libgit2 for Git-status support (or build with `--no-default-features` to skip that dependency).

The problem it solves

Stock `ls` on Linux and macOS shows file names and, with `-l`, permissions and sizes — nothing about which files changed in the current Git branch, no icons, and no colored size scale to tell a 2KB config from a 200MB binary at a glance. Anyone who works from a terminal all day either memorizes `ls -la` flag combinations or reaches for a wrapper; exa packages the common wrapper behavior — colors, Git awareness, tree recursion — into one binary instead of shell aliases and functions. That's the gap exa fills.

Best use cases

  • Reviewing a Git working tree at a glance: `exa -l --git` shows modified and untracked files without running `git status` separately.
  • Browsing directory structure quickly: `exa -T -L 2` gives a two-level tree instead of piping `find` through `sed` or installing a separate tree binary.
  • Spotting large files by eye: `exa -l --color-scale` shades sizes so an oversized log file or binary jumps out in a long listing.
  • Checking extended attributes on macOS: `exa -l -@` lists xattrs like quarantine flags directly in the file listing.

Who should try it — and who should skip

Anyone setting up a fresh terminal today should start with eza, not exa — same commands, same flags, active fixes. exa still makes sense if you're maintaining an old dotfiles repo or a script that already shells out to it and reinstalling isn't worth the churn right now, or if your distro's packaged `exa` is what's available and you just want colored, Git-aware listings without adding a new package. Skip it if you want icons and features added after the fork point, or if you care about a maintainer answering issues.

Related repositories

Source & attribution

Facts and quotes sourced from the ogham/exa GitHub repository (github.com/ogham/exa), including its README and stated Rust toolchain requirements.

GitHub data · last synced Aug 15, 2026Reviewed by Henry
Back to TopGit

Want a second opinion on exa?

Ask an AI that can read this page — one click and you get its take on exa.

GitHub