Command-line fluency is not a talent, it is about forty commands and a few habits. Spread over four weeks at twenty minutes a day, this is the order that builds fastest, because each stage makes the next one useful.
Learn cd - (jump back to the previous directory), pushd/popd, and globbing including ** with shopt -s globstar. Then the core file verbs with the flags that matter: cp -a to preserve everything, rsync -avh --dry-run src/ dst/ before any real copy, ls -lah, du -sh * | sort -h to find what is eating the disk. Finish the week on pipes: |, >, >>, 2>&1, and tee. The single mental shift that matters is that every command reads text and writes text, so anything can feed anything.
Replace grep with ripgrep: rg -n --hidden -g '!node_modules' "TODO" is faster and respects gitignore by default. Learn fd for finding files (fd -e ts -x wc -l), then the classic trio — cut -d, -f2, sort -u, uniq -c | sort -rn — which together answer most "how many of X" questions in one line. Add sed -i.bak 's/old/new/g' file and awk -F, '{s+=$3} END {print s}'. That is enough awk for years.
Install fzf and bind it to history — Ctrl-R becomes fuzzy search over everything you have ever typed, which alone repays the week. Add zoxide so z proj jumps to the directory you use most. Learn jq properly: jq -r '.items[] | [.id, .name] | @tsv' covers most API responses. Set up tmux with three bindings — new window, split, detach — and stop losing work when SSH drops. Write your first two shell functions in ~/.bashrc or ~/.zshrc; anything you type twice a day belongs there.
Learn job control (Ctrl-Z, bg, fg, jobs), nohup and &, and how to find what is holding a port: ss -tlnp | grep 8080 or lsof -i :8080. Then ps aux --sort=-%mem | head, htop, and kill -TERM before kill -9. Finish with SSH config: a ~/.ssh/config with Host aliases, ControlMaster auto and ControlPersist 10m turns repeated connections instant, and ssh -L 5432:localhost:5432 db-host gets you a local port for a remote database.
rsync --dry-run, rm -i, git clean -n.man and --help before searching the web; tldr <cmd> gives examples in two seconds."$var", always. Unquoted variables are the cause of most broken scripts.set -euo pipefail.bin/ directory on your PATH and promote any two-line function that survives a month.Not memorising flags. It means that when a task appears — find every file over 100 MB modified this week, count errors by hour in a log, rename 400 files — you reach for a pipeline instead of a GUI, and you get it right in two attempts. Thirty days of small daily use gets most people there.