exa a modern replacement for ls written in rust for Linux/Unix

last updated in Categories Command Line Hacks

ls is a command to show files in Linux and Unix-like operating systems. A ls command first appeared in a version of AT&T UNIX as well as in Multics. BSD and GNU Coreutils package provides the ls command with minor syntax changes. There is now third alternative named exa. It is a modern replacement for ls.

The exa uses colors 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. The exa command written in Rust, so it’s small, fast, and portable.

Features of exa

  1. By default exa use the colors.
  2. It 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.
  3. Tree view
  4. Git support: View the staged and unstaged status of every file, right there in the standard view. Also works in tree view.
  5. It queries files in parallel, giving you performance on par with ls.


One can install exa from the source code or use a package manager.

Install exa on macos

Use the brew command:
$ brew update && brew upgrade
$ brew cleanup
$ brew install exa

Sample outputs:

==> Downloading https://homebrew.bintray.com/bottles/exa-0.7.0.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring exa-0.7.0.sierra.bottle.tar.gz
==> Using the sandbox
==> Caveats
Bash completion has been installed to:
zsh completions have been installed to:
fish completions have been installed to:
==> Summary
  /usr/local/Cellar/exa/0.7.0: 9 files, 1.2MB

Install exa on an Arch Linux

Use the yaourt command:
# yaourt -S exa-git

Install exa using source code

To install Rust, run the following in your terminal, then follow the onscreen instructions:
$ curl https://sh.rustup.rs -sSf | sh
Install libgit2 and cmake using apt-get command/apt command:
$ sudo apt-get install libgit2-dev cmake git libhttp-parser2.1
To download the latest version, run:
$ git clone https://github.com/ogham/exa.git
Run make install in the new directory to compile and install exa into /usr/local/bin:
$ make install

Install exa using binary method on any Linux distro

Make sure you install libhttp-parser:
$ sudo apt-get install libhttp-parser2.1
$ wget https://the.exa.website/releases/exa-linux-x86_64-0.7.0.zip
$ unzip exa-linux-x86_64-0.7.0.zip
$ sudo mv exa-linux-x86_64 /usr/local/bin/

How do I use exa?

Simply type the exa command:
$ exa
$ exa -l
$ exa -l /etc/

Sample outputs:

Fig.01 exa in action
Fig.01 exa in action

The -l option displays extended file metadata as a table. Try another example:
$ exa -bghHliS
Sample outputs:
Fig.02 exa command
Fig.02 exa command

Setting up an alias

Add the following alias your bash shell startup file such as ~/.bashrc:
alias ls=exa

Getting help about exa command

Type the following command:
$ exa --help
Sample outputs:

  exa [options] [files...]
  -?, --help         show list of command-line options
  -v, --version      show version of exa
  -1, --oneline      display one entry per line
  -l, --long         display extended file metadata as a table
  -G, --grid         display entries as a grid (default)
  -x, --across       sort the grid across, rather than downwards
  -R, --recurse      recurse into directories
  -T, --tree         recurse into directories as a tree
  -F, --classify     display type indicator by file names
  --colo[u]r=WHEN    when to use terminal colours (always, auto, never)
  --colo[u]r-scale   highlight levels of file sizes distinctly
  -a, --all                  show hidden and 'dot' files
  -d, --list-dirs            list directories like regular files
  -r, --reverse              reverse the sort order
  -s, --sort SORT_FIELD      which field to sort by:
  --group-directories-first  list directories before other files
  -I, --ignore-glob GLOBS    glob patterns (pipe-separated) of files to ignore
  Valid sort fields:         name, Name, extension, Extension, size, type,
                             modified, accessed, created, inode, none
  -b, --binary       list file sizes with binary prefixes
  -B, --bytes        list file sizes in bytes, without any prefixes
  -g, --group        list each file's group
  -h, --header       add a header row to each column
  -H, --links        list each file's number of hard links
  -i, --inode        list each file's inode number
  -L, --level DEPTH  limit the depth of recursion
  -m, --modified     use the modified timestamp field
  -S, --blocks       show number of file system blocks
  -t, --time FIELD   which timestamp field to list (modified, accessed, created)
  -u, --accessed     use the accessed timestamp field
  -U, --created      use the created timestamp field
  --time-style       how to format timestamps (default, iso, long-iso, full-iso)
  --git              list each file's Git status, if tracked
  -@, --extended     list each file's extended attributes and sizes


The exa comes with saner defaults than ls. However, I will not install it on my server. It might be a good choice for your laptop or desktop computer. For more info see exa home page/exa project.

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

12 comment

  1. So, I googled a bit, and found this: https://askubuntu.com/questions/133389/no-such-file-or-directory-but-the-file-exists
    A bit down, this is explained: “The file exists, and you can even read it (for example, the command file shank-linux-120720110-1-bin displays something like “ELF 32-bit LSB executable …”), and yet when you try to execute it you’re told that the file doesn’t exist.
    The error message in this last case is admittedly confusing. What it’s telling you is that a key component of the runtime environment necessary to run the program is missing.”

    I do have libhttp-parser2.1 installed, but I guess there some other component missing.

  2. If you’re still only getting “file or directory not found” it sounds like you are either trying to run exa against a file or directory which doesn’t exist.
    What’s the exact command you’re running and the exact error you’re getting?
    Are you trying to run it in a directory that was deleted or against a file that doesn’t exist?

    Another thing is to double-check that the executable bit is set on the exa executable (should already be set in the download archive, but it could get messed up along the way).

  3. When it is added to the Debian package repository, then I will take a look at it. Until then, using ls and git separately will work very well for me.

  4. Unless you’re a masochist who enjoys faking library links and version numbers I’d avoid this completely if you’re on RHEL/Centos/Fedora.

  5. Followed the binary method, however I get this: -bash: exa: command not found
    Presumably it needs to be added to a path or something?

      1. Thank you. Sorry for late answer. It’s weird, but while the exa file is clearly there, when trying to execute it, I only get “No such file or directory”. Even if using absolute path.

        1. Looks like the instructions just copy the executable with the name as-is in the zip file. Try renaming it to exa:

          # fix name if you already moved it
          sudo mv /usr/local/bin/exa-linux-x86_64 /usr/local/bin/exa

          # or if you haven’t moved it over yet
          sudo mv exa-linux-x86_64 /usr/local/bin/exa

    Still, have a question? Get help on our forum!