Same job, better defaults
Most classic Unix tools (cat, ls, find, grep, du, df) have modern Rust/Go rewrites with sane defaults: color, gitignore-aware, human-readable. They don't replace the originals — the originals are always there — but for daily interactive use they're life-changing.
The lineup
bat← cat. Syntax highlighting, line numbers, paging.eza(formerly exa) ← ls. Color, git status, tree mode built in.fd← find. Friendly syntax (fd 'name'), respects .gitignore by default.ripgrep(rg) ← grep. 5–10× faster, ignores binaries / .gitignore / .git.dust← du. Tree of disk usage, sorted, colored.duf← df. Cleaner mount table.
Install in one shot
brew install bat eza fd ripgrep dust dufThe two killers — rg and fd
rg TODO --type py # every TODO in Python files
rg -l 'class Foo' src/ # files containing the pattern
rg -A 3 'def main' # 3 lines after each match
fd '\.test\.ts$' # find TS test files
fd -e jpg -x convert {} {.}.png # convert every jpg to pngDon't alias them on top of the originals
Tempting to alias cat=bat, but scripts that pipe to cat may not understand bat's pager. Use the new names. Keep the originals working unchanged.
Compare speed over the same scope
ripgrep skips hidden, ignored, and binary content by default. Align data scope and regex meaning before comparing it with grep; reading less data and processing the same data faster are different claims.
Separate human and machine output
Color, icons, tables, and automatic pagers help people but can break parsers. Before automation, find stable machine-readable output, disable decoration, and understand exit statuses.