The CLI tools every developer should know fall into five categories: file operations (ls/eza), text search (grep/ripgrep), downloads (wget/curl), shell customization (alias/fzf), and development workflow (tmux/git). This article maps classic tools against their modern Rust-based replacements across all five.
When you first open a terminal, your vocabulary might be limited to ls and cd. But the CLI world is packed with tools that can dramatically change how fast you work — if you know they exist.
File Operations & Navigation
The fundamentals. Listing files, moving around, copying, deleting — everything starts here.
Classic: ls / cd / cp / mv / rm
Part of GNU coreutils (latest: 9.10, February 2026). Pre-installed on every Linux distribution.
ls -alh # Detailed listing with human-readable sizes
cd ~/projects # Change directory
cp -r src/ dst/ # Copy directory recursively
mv old.txt new.txt # Rename / move
rm -rf build/ # Delete directory (use with caution)
Modern: eza + zoxide
eza (v0.23.4) is a Rust replacement for ls. Color output, Git status integration, and tree view come built-in.
eza -la --git # List with Git status
eza --tree --level=2 # Tree view (2 levels deep)
zoxide (v0.9.9) replaces cd. It remembers directories you've visited and lets you jump to them by typing a fragment of the path.
z proj # Jump to ~/projects (if you've cd'd there before)
zi # Interactive selection
# Inside WSL, follow the Linux steps
# Or directly in PowerShell:
winget install eza-community.eza
winget install ajeetdsouza.zoxide
Text Search & Processing
Searching logs, editing config files, processing JSON. Text manipulation is a developer's daily bread.
Classic: grep / sed / awk
grep -rn "TODO" src/ # Recursive search with line numbers
sed -i 's/old/new/g' file.txt # In-place find and replace
awk '{print $1, $3}' data.tsv # Extract columns 1 and 3
grep is one of the most-used commands, but it slows down noticeably on large codebases.
→ Details: grep Complete Guide: From Basics to ripgrep / sed & awk Practical Guide
Modern: ripgrep + fd + bat + jq
ripgrep (v15.1.0) is a Rust replacement for grep. Respects .gitignore by default and is significantly faster on large repositories.
rg "TODO" --type js # Search only JS files
rg "function \w+" -c # Count matches
fd (v10.4.2) replaces find. Simpler syntax and .gitignore-aware by default.
fd "\.mdx$" content/ # Find .mdx files
fd -e json -x jq '.version' # Find JSON files and process with jq
bat (v0.26.1) replaces cat. Syntax highlighting, line numbers, and Git diff integration out of the box.
bat src/index.ts # Display with syntax highlighting
bat -d file.txt # Show only Git changes
jq (v1.8.1) is the Swiss army knife for JSON. Essential for working with API responses.
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'
cat package.json | jq '.dependencies | keys'
→ Details: jq Complete Guide / Modern Rust CLI Tools
# Inside WSL, follow the Linux steps
# In PowerShell:
winget install BurntSushi.ripgrep.MSVC
winget install sharkdp.fd
winget install sharkdp.bat
winget install jqlang.jq
Download & Networking
Fetching files, calling APIs, communicating with remote servers.
wget — The Batch Download Workhorse
Excels at recursive downloads, interrupted transfer resumption, and site mirroring. The go-to tool for fetching files on a server.
wget -c https://example.com/large.iso # Resume interrupted download
wget -i urls.txt -P ~/downloads/ # Batch download from URL list
wget --mirror --convert-links https://example.com/ # Mirror a site
Latest versions: wget 1.25.0 / wget2 2.2.1. wget2 includes a fix for CVE-2025-69194 (CVSS 8.8, path traversal via malicious Metalink) — update if you're using it.
→ Details: wget Complete Guide
curl — The Universal HTTP Tool
Where wget specializes in downloads, curl handles all HTTP communication. API calls, header inspection, file uploads — it does everything.
curl -s https://api.example.com/data | jq '.' # Fetch API and format JSON
curl -I https://example.com # Get headers only
curl -X POST -d '{"key":"value"}' -H "Content-Type: application/json" https://api.example.com
Latest version: curl 8.19.0 (March 2026). Run curl --version to check yours.
→ Details: curl Complete Guide
Shell Customization
alias — Command Shortcuts
Shorten long commands you type repeatedly. Shell efficiency starts here.
alias gs='git status'
alias dc='docker compose'
alias ll='ls -alh --color=auto'
→ Details: The Complete Guide to Aliases
Choosing a Shell: bash vs zsh vs fish
| Shell | Key Trait |
|---|---|
| bash | Available everywhere. Best script compatibility |
| zsh | bash-compatible + powerful completions. macOS default |
| fish | Works great out of the box. Not bash-compatible |
If you use zsh, the oh-my-zsh git plugin alone adds 150+ aliases.
fzf — Fuzzy Find Everything
fzf (v0.70.0) is an interactive fuzzy finder. File selection, command history search, Git branch switching — it plugs into everything.
# Fuzzy-find a file and open it in vim
vim $(fzf)
# Search command history (enhanced Ctrl+R)
# After installing fzf, Ctrl+R uses it automatically
→ Details: fzf Complete Guide
# Inside WSL, follow the Linux steps
winget install junegunn.fzf
Development Workflow
tmux — Terminal Multiplexing
tmux (v3.6a) manages multiple panes and windows inside a single terminal. Keeps sessions alive over SSH, making it essential for server work.
tmux new -s work # Start a session named "work"
# Ctrl+b % — Split horizontally
# Ctrl+b " — Split vertically
# Ctrl+b d — Detach from session
tmux attach -t work # Reattach to session
→ Details: tmux Complete Guide
# Inside WSL, follow the Linux steps
# Not natively available on Windows
ssh / rsync — Remote Server Operations
ssh user@server # Remote connection
ssh -L 8080:localhost:3000 user@server # Port forwarding
rsync -avz ./dist/ user@server:/var/www/ # Sync only changed files
→ Details: ssh & rsync Practical Guide
Git — Version Control
Git needs no introduction, but there are tools that make CLI Git faster.
# lazygit — Git TUI inside your terminal
# delta — syntax-highlighted git diff
git diff | delta
Modern Alternatives (The Rust Generation)
There's a growing wave of projects rewriting classic GNU tools in Rust. Ubuntu 25.10 has already replaced GNU coreutils with the Rust-based uutils, and adoption in 26.04 LTS is being evaluated.
| Classic | Modern | Language | Key Improvement |
|---|---|---|---|
| ls | eza | Rust | Color, Git integration, tree view |
| cat | bat | Rust | Syntax highlighting, line numbers, pager |
| grep | ripgrep | Rust | Speed, .gitignore support |
| find | fd | Rust | Simple syntax, fast |
| cd | zoxide | Rust | Learning-based jump |
| sed | sd | Rust | Simpler regex syntax |
| du | dust | Rust | Visual disk usage |
| top | bottom | Rust | Modern system monitor |
You don't need all of them. Start with ripgrep + fd + bat — those three will immediately show you the difference. Installation instructions for each tool are in the relevant sections above.
→ Details: Modern Rust CLI Tools: eza, bat, fd, zoxide and Beyond
FAQ
What order should I learn CLI tools in?
Start with grep, find, curl, and ssh. These four cover the majority of daily development tasks. After that, try modern alternatives like ripgrep and fd — once you feel the speed difference, the switch happens naturally.
Will Rust tools fully replace classic GNU tools?
Not completely. Shell scripts and CI environments often assume GNU tools are present. A practical approach: use Rust tools for local development, classic tools in scripts. That said, Ubuntu has started shipping uutils as the default coreutils, so the landscape is shifting.
Are there differences between macOS and Linux CLI tools?
macOS ships BSD versions of commands (ls, sed, awk, etc.) whose options differ from the GNU versions. Run brew install coreutils to get the GNU versions and unify behavior. Rust-based tools are cross-platform, so they behave identically regardless of OS.
Any differences between WSL and native Linux?
The CLI tools themselves are identical. However, WSL file system performance is slower than native Linux — especially when accessing Windows files via /mnt/c. Working within /home inside WSL gives near-native speed.
How do fzf and ripgrep work together?
Pipe rg output into fzf for interactive filtering. For example: rg --line-number "TODO" | fzf lets you search for TODOs and pick one interactively. The fzf Wiki has many practical combination examples.
Are there alternatives to jq for JSON processing?
fx is an interactive JSON viewer, and gojq is a Go implementation of jq with some extended features. That said, jq is the de facto standard and covers most use cases on its own.
Should I install via cargo or apt?
apt is easier to manage as a system package manager, but versions tend to lag (e.g., Ubuntu 24.04 ships eza 0.18.x). Use cargo install when you need the latest release. It requires the Rust toolchain, but once set up, any tool is one cargo install <name> away from the latest version.
Wrapping Up
| Category | Learn First | Try Next |
|---|---|---|
| File operations | ls, cd, cp, mv | eza, zoxide |
| Text search | grep, find | ripgrep, fd, bat |
| JSON processing | — | jq |
| Downloads | wget, curl | — |
| Shell config | alias, .bashrc | fzf, oh-my-zsh |
| Development | git, ssh | tmux, lazygit |
CLI skills transfer across operating systems. GUI apps come and go, but commands stay.
Bookmark this page and come back whenever you want to try something new.
Related articles:
- Modern Rust CLI Tools: eza, bat, fd, zoxide and Beyond
- fzf Complete Guide: Fuzzy Finding That Changes Everything
- grep Complete Guide: From Basics to ripgrep
- tmux Complete Guide: Terminal Multiplexing for Developers
- jq Complete Guide: Master JSON Processing in the Terminal
- curl Complete Guide
- wget Complete Guide
- Shell Scripting Practical Guide