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

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 command.





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.

ADVERTISEMENTS



exa a modern replacement of ls command written in rust

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

Installing exa on Linux and Unix-like systems

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: /usr/local/etc/bash_completion.d zsh completions have been installed to: /usr/local/share/zsh/site-functions fish completions have been installed to: /usr/local/share/fish/vendor_completions.d = => Summary /usr/local/Cellar/exa/0.7.0: 9 files, 1.2MB ==> 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: /usr/local/etc/bash_completion.d zsh completions have been installed to: /usr/local/share/zsh/site-functions fish completions have been installed to: /usr/local/share/fish/vendor_completions.d ==> Summary /usr/local/Cellar/exa/0.7.0: 9 files, 1.2MB

Install exa on an Arch Linux

Use the pacman command:

$ sudo pacman -S exa

Fedora Linux

Run the dnf command:

sudo dnf install exa

Gentoo Linux

Type the following emerge command:

$ emerge sys-apps/exa

NixOS

Execute the nix-env command:

$ nix-env -i exa

OpenSUSE/SUSE Linux users run the following zypper command

sudo zypper install exa

Sample outputs:

[ sudo ] password for vivek: Retrieving repository 'openSUSE-Leap- 15.1 -Update' metadata .............. [ done ] Building repository 'openSUSE-Leap- 15.1 -Update' cache ................... [ done ] Loading repository data... Reading installed packages... Resolving package dependencies... The following NEW package is going to be installed: exa 1 new package to install. Overall download size: 443.5 KiB. Already cached: 0 B. After the operation, additional 1.2 MiB will be used. Continue? [ y/n/v/...? shows all options ] ( y ) : y Retrieving package exa-0.8.0-lp151.3.53.x86_64 ( 1 / 1 ) , 443.5 KiB ( 1.2 MiB unpacked ) Retrieving: exa-0.8.0-lp151.3.53.x86_64.rpm ................ [ done ( 13.6 KiB/s ) ] Checking for file conflicts: ............................................ [ done ] ( 1 / 1 ) Installing: exa-0.8.0-lp151.3.53.x86_64 ........................... [ done ] [sudo] password for vivek: Retrieving repository 'openSUSE-Leap-15.1-Update' metadata ..............[done] Building repository 'openSUSE-Leap-15.1-Update' cache ...................[done] Loading repository data... Reading installed packages... Resolving package dependencies... The following NEW package is going to be installed: exa 1 new package to install. Overall download size: 443.5 KiB. Already cached: 0 B. After the operation, additional 1.2 MiB will be used. Continue? [y/n/v/...? shows all options] (y): y Retrieving package exa-0.8.0-lp151.3.53.x86_64 (1/1), 443.5 KiB ( 1.2 MiB unpacked) Retrieving: exa-0.8.0-lp151.3.53.x86_64.rpm ................[done (13.6 KiB/s)] Checking for file conflicts: ............................................[done] (1/1) Installing: exa-0.8.0-lp151.3.53.x86_64 ...........................[done]

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://github.com/ogham/exa/releases/download/v0.9.0/exa-linux-x86_64-0.9.0.zip

$ unzip exa-linux-x86_64-0.9.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:



$ exa -bghHliS

Setting up an alias

The -l option displays extended file metadata as a table. Try another example:Sample outputs:

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

alias ls=exa

Another option to create a permanent Bash alias on Linux/Unix is as follows:

echo "alias ls='exa -l'" >> ~/.bash_aliases

Getting help about exa command

Type the following command:

$ exa --help

Sample outputs:

Usage: exa [ options ] [ files... ] -?, --help show list of command-line options -v, --version show version of exa DISPLAY OPTIONS - 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 FILTERING AND SORTING OPTIONS -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 LONG VIEW OPTIONS -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 Usage: exa [options] [files...] -?, --help show list of command-line options -v, --version show version of exa DISPLAY OPTIONS -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 FILTERING AND SORTING OPTIONS -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 LONG VIEW OPTIONS -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

Conclusion

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.