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
.gitignorerespect (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
winget install eza-community.eza
Basic usage
# 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
| Feature | ls | eza |
|---|---|---|
| Color output | --color=auto to enable | Enabled by default |
| Git status | Not supported | --git flag |
| Tree view | Requires separate tree command | Built-in --tree |
| Icons | Not supported | --icons flag |
| Header row | None | --header for column names |
| Hyperlinks | Not 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
winget install sharkdp.bat
Basic usage
# 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
| Feature | cat | bat |
|---|---|---|
| Syntax highlighting | None | 200+ languages |
| Line numbers | cat -n | Shown by default |
| Git diff | Not supported | -d shows changed lines |
| Pager | None (pipe to less) | Built-in auto-paging |
| Invisible characters | cat -A | bat -A (colorized) |
| Themes | None | 20+ bundled themes |
fzf integration
bat pairs exceptionally well with fzf as a preview command.
# 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
winget install sharkdp.fd
Basic usage
# 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
| Feature | find | fd |
|---|---|---|
| Syntax | find . -name "*.js" | fd -e js |
| Regex | -regex flag required | Regex by default |
.gitignore respect | Not supported | Enabled by default |
| Hidden files | Included by default | Excluded by default (-H to include) |
| Color output | None | Enabled by default |
| Speed | Single-threaded | Multi-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
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):
eval "$(zoxide init bash)"
For zsh (~/.zshrc):
eval "$(zoxide init zsh)"
For fish (~/.config/fish/config.fish):
zoxide init fish | source
This enables the z and zi commands.
Basic usage
# 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
| Feature | cd | zoxide |
|---|---|---|
| Full path required | Yes | Partial match jumps |
| Learning | None | Ranks by frequency and recency |
| Interactive selection | None | zi with fzf integration |
| Previous directory | cd - | z - |
| Tab completion | From filesystem | From 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.
# 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.
# 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.
# 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.
# 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.
# 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)
brew install eza bat fd zoxide fzf ripgrep sd dust bottom git-delta
cargo (Rust toolchain)
cargo install eza bat fd-find zoxide sd du-dust bottom git-delta
Recommended aliases
Add the following to your ~/.bashrc or ~/.zshrc:
# ---------- 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
findwith simpler syntax. Respects.gitignoreautomatically 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.