32blogby StudioMitsu

Modern Rust CLI Tools: eza, bat, fd, zoxide and Beyond

Replace ls, cat, find, and cd with faster Rust alternatives. Installation, configuration, aliases, and practical combinations.

10 min read
RustCLILinuxezabatfdzoxide
On this page

The colorless output of ls. The verbose flags of find. The plain display of cat. Classic UNIX commands are rock-solid, but in 2026, interactive terminal work deserves better defaults.

Over the past few years, Rust rewrites of these tools have gained serious traction. Color output, Git awareness, automatic .gitignore respect — features that should have always been there are now built in from the start.

This guide focuses on four high-impact tools — eza, bat, fd, and zoxide — covering installation, practical usage, and alias configuration.

Why Rust-based CLI tools?

Rust has become the language of choice for CLI tools, and for good reason.

  • Memory safety: safe memory management without garbage collection. No memory leaks in long-running processes
  • Zero-cost abstractions: high-level code that compiles to C/C++-level performance
  • Single binary distribution: statically linked binaries with no runtime dependencies — no Python or Node.js needed
  • Cross-platform: the same codebase builds on Linux, macOS, and Windows

Rust CLI tools also share common design principles:

  • Automatic .gitignore respect (fd, ripgrep, etc.)
  • Color output enabled by default
  • Proper Unicode handling
  • Clear, helpful error messages

As of 2026, Ubuntu is actively working on replacing GNU coreutils with uutils, a Rust implementation. Rust CLI tools are moving from "nice alternative" to "the standard."

eza: ls evolved

eza is a modern replacement for ls. It started as a community fork of the now-unmaintained exa project.

Installation

powershell
winget install eza-community.eza

Basic usage

bash
# Detailed listing with hidden files
eza -la

# Detailed listing with Git status
eza -la --git

# Tree view (2 levels deep)
eza --tree --level=2

# Show file type icons (requires a Nerd Font)
eza --icons

# Sort by modification time
eza -la --sort=modified

# Directories first
eza --group-directories-first

ls vs eza comparison

Featurelseza
Color output--color=auto to enableEnabled by default
Git statusNot supported--git flag
Tree viewRequires separate tree commandBuilt-in --tree
IconsNot supported--icons flag
Header rowNone--header for column names
HyperlinksNot supported--hyperlink for terminal links

bat: cat with wings

bat adds syntax highlighting, line numbers, and Git diff markers to cat. It supports over 200 languages out of the box.

Installation

powershell
winget install sharkdp.bat

Basic usage

bash
# Display with syntax highlighting
bat file.py

# Line numbers only (no header or grid)
bat -n file.py

# Show only Git-changed lines
bat -d file.py

# Explicitly set the language
bat -l json data.txt

# Change the color theme
bat --theme=TwoDark file.rs

# List available themes
bat --list-themes

# Show invisible characters (tabs, newlines, spaces)
bat -A file.txt

cat vs bat comparison

Featurecatbat
Syntax highlightingNone200+ languages
Line numberscat -nShown by default
Git diffNot supported-d shows changed lines
PagerNone (pipe to less)Built-in auto-paging
Invisible characterscat -Abat -A (colorized)
ThemesNone20+ bundled themes

fzf integration

bat pairs exceptionally well with fzf as a preview command.

bash
# Syntax-highlighted preview when selecting files
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'

fd: find simplified

fd is a simple alternative to find, built by the same developer as bat (sharkdp). It respects .gitignore by default and uses regex patterns out of the box.

Installation

powershell
winget install sharkdp.fd

Basic usage

bash
# Search by regex (recursive by default)
fd "\.mdx$"

# Filter by extension
fd -e js

# Directories only
fd -t d

# Case-sensitive search
fd -t f -s "README"

# Include hidden files
fd -H "\.env"

# Run a command on each match
fd -e json -x jq '.version'

# Bulk delete matching files
fd -e tmp -X rm

find vs fd comparison

Featurefindfd
Syntaxfind . -name "*.js"fd -e js
Regex-regex flag requiredRegex by default
.gitignore respectNot supportedEnabled by default
Hidden filesIncluded by defaultExcluded by default (-H to include)
Color outputNoneEnabled by default
SpeedSingle-threadedMulti-threaded
Command execution-exec-x (each) / -X (batch)

fd shares its design philosophy with ripgrep. Both respect .gitignore automatically and use smart case matching — case-insensitive when the pattern is all lowercase, case-sensitive when it contains uppercase letters.

zoxide: smarter cd

zoxide is a "learning" replacement for cd. It remembers which directories you visit and lets you jump to them with just a partial name.

Installation

powershell
winget install ajeetdsouza.zoxide

Shell integration (required)

zoxide does not work out of the box — you need to add shell integration to your config.

For bash (~/.bashrc):

bash
eval "$(zoxide init bash)"

For zsh (~/.zshrc):

bash
eval "$(zoxide init zsh)"

For fish (~/.config/fish/config.fish):

fish
zoxide init fish | source

This enables the z and zi commands.

Basic usage

bash
# Jump to a directory by partial match
z proj
# → jumps to ~/projects (if you've visited it before)

# Narrow down with multiple keywords
z proj content
# → jumps to ~/projects/pj-002-content

# Interactive selection (requires fzf)
zi

# Go back to the previous directory
z -

# List all learned directories
zoxide query --list

cd vs zoxide comparison

Featurecdzoxide
Full path requiredYesPartial match jumps
LearningNoneRanks by frequency and recency
Interactive selectionNonezi with fzf integration
Previous directorycd -z -
Tab completionFrom filesystemFrom learned data

More tools worth trying

Beyond eza, bat, fd, and zoxide, the Rust CLI ecosystem has plenty more to offer.

sd: sed replacement

sd is an intuitive alternative to sed. It requires minimal regex escaping compared to sed's often cryptic syntax.

bash
# Replace text in a file
sd 'oldtext' 'newtext' file.txt

# Regex replacement
sd 'v(\d+)' 'version-$1' changelog.md

# From stdin (pipe)
echo 'hello world' | sd 'world' 'Rust'

v1.1.0 made line-by-line processing the default (breaking change). Keep this in mind when upgrading from older versions.

dust: du replacement

dust gives you a visual breakdown of disk usage.

bash
# Visualize disk usage in the current directory
dust

# Show only the top 10 entries
dust -n 10

# Specify a directory
dust /var/log

bottom: top replacement

bottom is a modern system monitor that visualizes CPU, memory, disk, and network in real time.

bash
# Launch (btm command)
btm

v0.12.3 fixed crashes with multi-byte UTF-8 strings, improving stability in non-ASCII environments.

delta: git diff replacement

delta adds syntax highlighting to Git diff output.

bash
# Add to your Git config (~/.gitconfig)
git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'

After setup, git diff, git log -p, and git show automatically pipe through delta.

Installation (all four)

All of these tools are available through brew, cargo, and winget.

bash
# Homebrew
brew install sd dust bottom git-delta

# cargo
cargo install sd du-dust bottom git-delta

Bulk install and alias setup

Here is how to set up all the tools covered in this guide at once.

Homebrew (macOS / Linux)

bash
brew install eza bat fd zoxide fzf ripgrep sd dust bottom git-delta

cargo (Rust toolchain)

bash
cargo install eza bat fd-find zoxide sd du-dust bottom git-delta

Add the following to your ~/.bashrc or ~/.zshrc:

bash
# ---------- Modern tool aliases ----------
alias ls='eza'
alias ll='eza -la --git'
alias lt='eza --tree --level=2'
alias cat='bat --paging=never'
alias find='fd'

# ---------- Ubuntu users ----------
# alias bat='batcat'
# alias fd='fdfind'

# ---------- zoxide integration ----------
eval "$(zoxide init bash)"  # change bash to zsh if needed

Wrapping Up

Here is a recap of the Rust CLI tools covered in this guide:

  • eza: adds color, Git status, tree view, and icons to ls. ll='eza -la --git' is the must-have alias
  • bat: adds syntax highlighting, line numbers, and Git diff to cat. Also works great as an fzf preview command
  • fd: redesigns find with simpler syntax. Respects .gitignore automatically and runs multi-threaded
  • zoxide: adds learning to cd. Jump to directories by partial name match

On Ubuntu, note that bat installs as batcat and fd-find installs as fdfind. Set up aliases and they work the same as everywhere else.

Start with just one tool — eza or bat makes the biggest first impression. Once you see the difference, you will want the rest.

For related reading, check out ripgrep as a grep replacement, fzf integration techniques, sd in the context of sed, and the CLI toolkit overview.