A recent XDA piece pointed out that Ubuntu 26.04’s biggest security upgrade is the quiet one: GNU coreutils being replaced piece by piece with Rust-based equivalents. Memory safety, fewer CVEs in the long tail of system utilities, and a side benefit of usability improvements that the GNU versions never got. You don’t have to wait for the Ubuntu LTS to flip the switch. We tested eight of the best apps for modern CLI utilities on Windows, macOS, and Linux, every one of which is already installable today.
The benchmark for each: how it improves on the GNU original, how well it behaves on every platform, and whether it earns its keep in a daily workflow.
What to look for in a modern CLI utility
A handful of criteria separate the picks that stick from the ones you uninstall after a week:
- Backwards compatibility. The strong replacements accept the same flags as the original GNU tool. Switching is gradual rather than catastrophic.
- Cross-platform. Linux, macOS, and Windows shells (PowerShell, Git Bash, WSL) should all work. Most of the tools below ship pre-built binaries for all three.
- Speed. Rust and Go binaries are typically faster than their C predecessors. The gap shows up on large repositories.
- Output quality. Syntax highlighting, Unicode handling, color schemes, and clean defaults distinguish the modern crop.
- Configuration ergonomics. A single TOML or YAML file beats a hundred environment variables.
- Active maintenance. Each project below shipped a release in the last six months.
Quick comparison
| Tool | Replaces | Platforms | Language | Cost |
|---|---|---|---|---|
| Starship | PS1 / bash prompt | Windows, macOS, Linux | Rust | Free |
| bat | cat | Windows, macOS, Linux | Rust | Free |
| eza | ls | Windows, macOS, Linux | Rust | Free |
| ripgrep | grep | Windows, macOS, Linux | Rust | Free |
| fd | find | Windows, macOS, Linux | Rust | Free |
| zoxide | cd | Windows, macOS, Linux | Rust | Free |
| fzf | reverse-search | Windows, macOS, Linux | Go | Free |
| bottom | top / htop | Windows, macOS, Linux | Rust | Free |
The 8 best apps for modern CLI utilities on desktop
1. Starship — best cross-shell prompt
Starship is the cross-shell prompt that won. It replaces the per-shell PS1 (bash), prompt function (zsh), and PROMPT variable (fish) with one TOML configuration file that draws the same prompt everywhere. Detect the Git branch, the language version, the AWS profile, the Kubernetes context, the battery state, the active virtualenv. All in one binary. Starship for modern CLI work removes the largest dotfiles file every developer has to maintain.
Where it falls short: Custom prompts written for a specific shell sometimes need light adaptation. Some modules require external tools (the Kubernetes module needs kubectl).
Pricing:
- Free: fully open source under ISC
- Paid: none
Platforms: Windows, macOS, Linux
Download: Starship
Bottom line: The first tool to install when migrating to modern CLI utilities. Replaces a hundred lines of bashrc.
2. bat — best cat replacement
bat is a cat replacement with syntax highlighting, line numbers, Git integration, and automatic paging. Pipe a file into bat and it formats by extension, shows changed lines from the Git index, and pages cleanly. Aliased to cat in a dotfiles repo, it disappears into muscle memory within a week. bat for modern CLI work is one of the highest-impact swaps you can make.
Where it falls short: Output is fancier than scriptable. For pipelines that expect raw cat output, use bat -pp or stick with cat.
Pricing:
- Free: fully open source under MIT/Apache
- Paid: none
Platforms: Windows, macOS, Linux
Download: bat on GitHub
Bottom line: Install, alias cat=bat --paging=never --style=plain if you want a drop-in, otherwise alias bat and let cat keep its place in pipelines.
3. eza — best ls replacement
eza is the maintained fork of exa, an ls replacement with color, Git status, icons, hyperlinks, and a tree view built into eza --tree. The --git flag annotates each file with its index state; the --long mode gives readable permissions and human file sizes by default. eza for modern CLI work makes ls -la something you can read at a glance.
Where it falls short: Doesn’t reproduce every esoteric GNU ls flag. Scripts that rely on specific ls output should keep using ls.
Pricing:
- Free: fully open source under MIT
- Paid: none
Platforms: Windows, macOS, Linux
Download: eza on GitHub
Bottom line: Aliased to ls, this is the swap most developers notice on day one.
4. ripgrep — best grep replacement
ripgrep (ripgrep, command rg) is the project that taught the rest of the modern CLI community what was possible. It respects gitignore by default, walks directories in parallel, handles Unicode properly, and finishes large searches in a fraction of the time GNU grep takes. It also ships in VS Code as the search backend. ripgrep for modern CLI work is the file-search default for most developers in 2026.
Where it falls short: Defaults filter .gitignored files, which surprises new users searching for build artifacts. The flag soup catches up to grep eventually.
Pricing:
- Free: fully open source under MIT/Unlicense
- Paid: none
Platforms: Windows, macOS, Linux
Download: ripgrep on GitHub
Bottom line: Install it, type rg, never look back.
5. fd — best find replacement
fd is a friendlier find. The syntax is sane (fd pattern instead of find . -name '*pattern*'), it respects gitignore like ripgrep, the colors mark file types, and parallel walking makes it faster on large trees. fd for modern CLI work shortens the most awkward command every developer writes from memory.
Where it falls short: Doesn’t cover find’s full operator vocabulary (-exec, -newer, -size combinations). Power users keep find for those cases.
Pricing:
- Free: fully open source under MIT/Apache
- Paid: none
Platforms: Windows, macOS, Linux
Download: fd on GitHub
Bottom line: Aliased f or used as fd, it makes the daily 80 percent of find usage shorter and faster.
6. zoxide — best cd replacement
zoxide is a smarter cd. It tracks the directories you visit, ranks them by frequency, and lets z partial-name jump you straight there from anywhere on the filesystem. After a week of use, it builds a personalized index that beats typing full paths or relying on tab-completion. zoxide for modern CLI work eliminates the most repetitive command in any shell.
Where it falls short: Until the index is built, it’s just cd. The shell integration needs to be added to your rc file, which not every user notices.
Pricing:
- Free: fully open source under MIT
- Paid: none
Platforms: Windows, macOS, Linux
Download: zoxide on GitHub
Bottom line: Install, use cd for a week to seed the database, then alias cd=z.
7. fzf — best fuzzy finder
fzf is the general-purpose fuzzy finder. Pipe a list (files, processes, git branches, command history) into fzf, type a fragment, hit enter, get the entry. The shell integration adds Ctrl-R reverse-search through history, Ctrl-T file picker, and Alt-C cd picker. fzf for modern CLI work is the interactive layer over every other tool on this list: pipe ripgrep into fzf for live search, pipe git branches into fzf to switch, pipe processes into fzf to kill.
Where it falls short: Written in Go rather than Rust, but that’s a stylistic point rather than a functional one. Older versions had different keybinding defaults; fresh installs should use 0.50 or newer.
Pricing:
- Free: fully open source under MIT
- Paid: none
Platforms: Windows, macOS, Linux
Download: fzf on GitHub
Bottom line: The most powerful single tool in this category. Worth learning the bindings even if you never reconfigure the defaults.
8. bottom — best top replacement
bottom (command btm) is the cross-platform htop replacement. CPU per core, RAM, network IO, disk IO, processes (sortable, killable), and a temperature panel where supported. The Vim-style keybindings beat htop’s function keys for users who already think in hjkl. bottom for modern CLI work covers system inspection in a single binary that works the same on Linux, macOS, and Windows.
Where it falls short: Doesn’t replace specialized tools (nethogs, iotop) for narrow profiling. Some terminals need a Nerd Font to render the graphs cleanly.
Pricing:
- Free: fully open source under MIT
- Paid: none
Platforms: Windows, macOS, Linux
Download: bottom on GitHub
Bottom line: The right pick when one binary needs to give you a system overview across three operating systems.
How to pick the right one
You don’t pick one. You pick the order to install:
- Starship first. The prompt change is the loudest signal that the shell has been upgraded.
- ripgrep, fd, bat, eza next. The four daily-driver replacements that touch every shell session.
- zoxide after a few weeks. The index needs visits to seed.
- fzf any time. Pairs with everything above.
- bottom when you next need htop. Replaces a separately-installed system monitor with a portable binary.
The whole stack installs in five minutes through Homebrew, winget, apt, or the official installer scripts. Most developers run all eight by the end of the first week.
FAQ
Are these CLI tools faster than GNU coreutils?
For the operations they target, usually yes. ripgrep, fd, and eza scale notably better on large repositories. The difference shows up on multi-gigabyte codebases more than on small projects.
Do these tools work on Windows?
Yes. Every tool on this list ships pre-built Windows binaries, runs in PowerShell, and is friendlier than the original GNU equivalents on Windows. Scoop, winget, and Chocolatey package all eight.
What’s the difference between Ubuntu’s Rust coreutils and these tools?
Ubuntu 26.04 is gradually replacing the implementation of the existing GNU commands (ls, cp, mv, rm, cat) with the uutils Rust project, which mirrors the original command names and flags. The eight tools on this list are different commands (eza, bat, rg, fd) that go beyond drop-in replacement to add features.
Do I need to learn new flags?
Mostly no. ripgrep, fd, bat, and eza accept most of the flags from the GNU originals plus a few new ones. Starship and zoxide are configured in a single file each. fzf is a new tool to learn but its bindings are intuitive once typed.
Are these tools secure?
Rust’s memory safety eliminates entire classes of bug that plagued C-era CLI tools. None of the projects on this list has had a major security advisory in recent years. The packaging side (cargo install, npm-style ecosystems) introduces its own risk surface; install from your system package manager when possible.
Why is fzf written in Go and not Rust?
Because Junegunn Choi shipped fzf in 2013, when the Rust ecosystem couldn’t yet support a project of that shape. It has stayed in Go because there is no reason to rewrite a tool that already does its job better than anything else.