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.
This article organizes the CLI tools every developer should know, by category. Classic tools that have been around since the '90s sit alongside their modern Rust-based replacements, so you can see what's changed and why.
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.
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.3.0) 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.0) 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'
# 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) — 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.18.0 (January 2026). Includes fixes for 3 CVEs discovered by AI. Run curl --version to check yours.
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
# 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
# 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
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. In 2026, Ubuntu is moving forward with plans to replace GNU coreutils with the Rust-based uutils implementation.
| 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.
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. Detailed guides for each tool are being added over time.