32blogby Studio Mitsu

The Developer's CLI Toolkit: A Complete Map

From file operations to text search, downloads, and shell customization. Every CLI tool developers should know, organized as classic vs modern alternatives.

by omitsu10 min read
On this page

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.

bash
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.

bash
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.

bash
z proj     # Jump to ~/projects (if you've cd'd there before)
zi         # Interactive selection
powershell
# 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

bash
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.

bash
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.

bash
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.

bash
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.

bash
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

powershell
# 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.

bash
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.

bash
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.

bash
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

ShellKey Trait
bashAvailable everywhere. Best script compatibility
zshbash-compatible + powerful completions. macOS default
fishWorks 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.

bash
# 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

powershell
# 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.

bash
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

powershell
# Inside WSL, follow the Linux steps
# Not natively available on Windows

ssh / rsync — Remote Server Operations

bash
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.

bash
# 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.

ClassicModernLanguageKey Improvement
lsezaRustColor, Git integration, tree view
catbatRustSyntax highlighting, line numbers, pager
grepripgrepRustSpeed, .gitignore support
findfdRustSimple syntax, fast
cdzoxideRustLearning-based jump
sedsdRustSimpler regex syntax
dudustRustVisual disk usage
topbottomRustModern 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

CategoryLearn FirstTry Next
File operationsls, cd, cp, mveza, zoxide
Text searchgrep, findripgrep, fd, bat
JSON processingjq
Downloadswget, curl
Shell configalias, .bashrcfzf, oh-my-zsh
Developmentgit, sshtmux, 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: