exa is a modern replacement for ls. It uses colours for information by default, helping you distinguish between many types of files, such as whether you are the owner, or in the owning group. It also has extra features not present in the original ls, such as viewing the Git status for a directory, or recursing into directories with a tree view. exa is written in Rust, so it’s small, fast, and portable.

$ exa
Cargo.toml  LICENCE  README.md  screenshot.png  src  target

$ exa -l
.rw-r--r--  9.6k ben 29 Jun 16:16 Cargo.lock
.rw-r--r--   547 ben 23 Jun 10:54 Cargo.toml
.rw-r--r--  1.1k ben 23 Nov  2014 LICENCE
.rw-r--r--  2.5k ben 21 May 14:38 README.md
.rw-r--r--  382k ben  8 Jun 21:00 screenshot.png
drwxr-xr-x     - ben 29 Jun 14:50 src
drwxr-xr-x     - ben 28 Jun 19:53 target

$ exa -bghHliS
   inode Permissions Links  Size Blocks User Group Date Modified Name
21214836 .rw-r--r--      1 9.4Ki     24 ben  staff 29 Jun 16:16  Cargo.lock
19896082 .rw-r--r--      1   547      8 ben  staff 23 Jun 10:54  Cargo.toml
 1971322 .rw-r--r--      1 1.1Ki      8 ben  staff 23 Nov  2014  LICENCE
19134861 .rw-r--r--      1 2.4Ki      8 ben  staff 21 May 14:38  README.md
20087308 .rw-r--r--      1 373Ki    752 ben  staff  8 Jun 21:00  screenshot.png
 1971325 drwxr-xr-x     12     -      - ben  staff 29 Jun 14:50  src
21150214 drwxr-xr-x      4     -      - ben  staff 28 Jun 19:53  target


All the colours: When dealing with pages and pages of information, it’s nice to be able to distinguish individual fields by colour. Different types of file and data will be coloured differently, and colours in the user and group columns will reflect whether you are the file’s owner, or are in the owning group.

All the information: exa can display a file’s extended attributes, as well as standard filesystem information such as the inode, the number of blocks, and a file’s various dates and times.

Tree view: Not only is the standard tree tool built-in, but it’ll show you your files’ information alongside the hierarchy.

Git support: View the staged and unstaged status of every file, right there in the standard view. Also works in tree view.

It’s fast: exa queries files in parallel, giving you performance on par with ls.

Installation Instructions

The easiest way to get exa is to download a binary for your platform and place it in a directory within your $PATH, such as /usr/local/bin. The binary is entirely self-contained, so that’s all you need.

From a Package Manager

If you’re on a Mac with Homebrew, then you can run:

brew install exa

If you’re on Arch Linux with Yaourt, then you can run:

yaourt -S exa-git

If your OS isn’t listed here, then you’ll have to download and install the binary yourself. Such is life.

From Source

If you’re brave and have development tools installed, you can build the latest development version from source.

  1. Download and install Rust for your platform.
  2. Install libgit2 and cmake.
  3. To download the latest version, run:
    git clone https://github.com/ogham/exa.git
  4. Run make install in the new directory to compile and install exa into /usr/local/bin.


Is this a drop-in replacement for ls?

No — exa has, in my opinion, much saner defaults than ls, so while the available command-line options are similar, they are not exactly the same. Most of the common options will work consistently, though. For example, exa prints human-readable file sizes by default (when would you not want that?) so ls -h no longer applies.

Why would I want Git in my file listing anyway?

Because you get to see the Git information alongside everything else. Yes, it’s already trivial to just run git status when you’re in your shell. But when you need to double-check exactly which files have been staged, you really need to see it clearly!

Windows support?

Sorry, not yet — although Rust is cross-platform, I don’t have a Windows machine to develop on, and a few Unix-isms are still present here and there. I don’t want to release v1.0 without Windows support, though.

What licence is the code under?

It uses the MIT licence.