Introduction
A couple of months ago, I started working at Lingo.dev. Since I was starting on a new laptop with a completely fresh slate, I took the opportunity to investigate the best Rust-based CLIs to help make my daily work that little bit more delightful.
Deep down, I know that remaking something in Rust doesn't inherently mean that it's better... but it certainly doesn't seem to hurt.
1. grep → ripgrep (rg) (55.0k ⭐)
ripgrep searches recursively and respects .gitignore
by default. It skips binary and hidden files automatically, making searches faster and more relevant. The performance improvements come from parallelization and smart file filtering that avoids searching node_modules and build artifacts.
# grep grep -r "TODO" src/ # rg rg "TODO" src/
2. cat → bat (54.2k ⭐)
bat adds syntax highlighting, line numbers, and Git integration to file viewing. It pages long output automatically using your system pager. The syntax highlighting works for hundreds of languages and formats, making code review in the terminal more readable.
# cat cat main.rs # bat bat main.rs
3. find → fd (39.5k ⭐)
fd simplifies file finding with regex support, color output, and parallel execution. It ignores hidden and gitignored files by default, reducing noise in search results. The simplified syntax makes common operations like finding files by extension more intuitive.
# find find . -name "*.rs" # fd fd -e rs
4. cd → zoxide (29.3k ⭐)
zoxide learns your frequent directories. It jumps to them with partial names using frecency (frequency + recency) scoring. The tool eliminates repetitive navigation through deep directory structures.
# cd cd /home/user/projects/myproject # z z myproject
5. make → just (27.5k ⭐)
just runs project commands without build system complexity. It organizes development tasks in a readable format. The syntax is simpler than make, focusing on commands rather than dependencies.
# make make build # just just build
6. diff → delta (27.4k ⭐)
delta adds syntax highlighting to diffs. It supports side-by-side view and integrates with Git as a pager. The highlighting makes it easier to spot changes within lines, not just which lines changed.
# diff diff -u file1.txt file2.txt # delta diff -u file1.txt file2.txt | delta
7. time → hyperfine (26.0k ⭐)
hyperfine benchmarks commands statistically. It runs multiple iterations with warmups to provide reliable measurements. The statistical analysis includes mean, median, and standard deviation.
# time time ls -la # hyperfine hyperfine 'ls -la'
8. ls → lsd (14.8k ⭐)
lsd adds color, icons, Git status, and tree view to directory listings. It respects existing ls
flags while providing better visual hierarchy through icons and color coding. The Git integration shows modified files at a glance without running separate commands.
# ls ls -la # lsd lsd -la
9. top/htop → bottom (btm) (11.8k ⭐)
bottom shows system metrics as interactive graphs. It combines process management with resource monitoring in a single interface. The graphs provide historical context that text-based displays lack.
# top top # btm btm
10. tree → broot (11.7k ⭐)
broot filters directory trees interactively. Type to filter, navigate, and execute actions on selections. The fuzzy matching and modal interface speed up file system navigation.
# tree tree -L 2 # broot broot --sizes
11. du → dust (10.4k ⭐)
dust visualizes disk usage with bars and smart recursion. It filters results by regex to find specific file types. The bar charts make it immediately obvious which directories consume the most space.
# du du -sh * # dust dust
12. hexdump/xxd → hexyl (9.8k ⭐)
hexyl colors hex output to distinguish offsets, bytes, and ASCII. It makes binary inspection clearer by highlighting different byte values and patterns. The colored output helps identify structures and patterns in binary data.
# xxd xxd file.bin # hexyl hexyl file.bin
13. curl → xh (6.8k ⭐)
xh simplifies HTTP requests with concise syntax. It outputs readable responses by default with automatic formatting. The HTTPie-compatible syntax reduces the complexity of common API interactions.
# curl curl https://httpbin.org/json # xh xh GET https://httpbin.org/json
14. sed → sd (6.5k ⭐)
sd focuses on search and replace with simple syntax. It uses regex by default; use -F
for literal matches if you don't want escaping. The straightforward find-and-replace syntax eliminates the cognitive overhead of sed's command language.
# sed sed -i 's/foo/bar/g' file.txt # sd sd 'foo' 'bar' file.txt
15. dig → dog (6.5k ⭐)
dog queries DNS with colored output. It supports DNS over TLS, HTTPS, and JSON export for modern DNS workflows. The colored output groups related records and highlights important fields.
# dig dig example.com # dog dog example.com
16. ps → procs (5.7k ⭐)
procs displays processes in colored tables. It includes search, tree view, and live updates without additional flags. The default output shows the most relevant information in a scannable format.
# ps ps aux # procs procs
17. man → tealdeer (tldr) (5.4k ⭐)
tealdeer provides example-driven command summaries. Pages cache locally for instant access without network delays. The examples focus on common use cases rather than exhaustive documentation.
# man man tar # tldr tldr tar
18. sudo → sudo-rs (3.9k ⭐)
sudo-rs reimplements sudo in memory-safe Rust. Ubuntu 25.10 ships it by default as a security improvement. The implementation eliminates entire classes of vulnerabilities through Rust's memory safety guarantees.
# sudo sudo apt update # sudo-rs sudo-rs apt update
19. cut → choose (2.0k ⭐)
choose uses zero-based indexing and Python-style ranges. It supports regex separators for complex delimiters. The Python-style slicing syntax makes it easier to select ranges and work from the end of lines.
# cut cut -d, -f1,3 data.csv # choose choose -f, 0 2 data.csv
20. rm → rip (1.6k ⭐)
rip moves files to a graveyard instead of deleting them. Deletions are reversible, providing a safety net against accidental removal. The graveyard is automatically cleaned based on age or size limits.
# rm rm file.txt # rip rip file.txt
21. awk → frawk (1.3k ⭐)
frawk accelerates awk scripts with JIT compilation. It includes native CSV and TSV support, eliminating the need for field separator configuration. The performance gains are most noticeable on large files where the JIT compiler can optimize hot paths.
# awk awk -F, '{print $1}' data.csv # frawk frawk -d, '{print $1}' data.csv
22. bc → eva (894 ⭐)
eva calculates expressions with syntax highlighting. It includes a REPL with history for interactive calculations. The tool supports common mathematical functions and constants without configuration.
# bc echo "2 + 2" | bc # eva eva "2 + 2"
23. cp → xcp (840 ⭐)
xcp adds progress bars to file copying. It optimizes large transfers automatically using platform-specific techniques. The progress indication is especially valuable for network copies and large directory trees.
# cp cp -r source/ dest/ # xcp xcp -r source/ dest/
24. xargs → rargs (549 ⭐)
rargs adds regex capture groups to command templates. It supports batch operations and parallel execution for better performance. The regex patterns let you transform filenames and arguments as part of the command execution.
# xargs ls *.txt | xargs -I {} mv {} {}.bak # rargs ls *.txt | rargs -p '(.*)' mv {0} {0}.bak
25. rename → rnr (548 ⭐)
rnr batch renames files using regex. It prevents collisions and supports undo through dry-run mode. The tool shows what will change before committing, reducing rename accidents.
# rename rename 's/\.bak$//' *.bak # rnr rnr -f '(.*)\.bak' '$1' *.bak
26. sort | uniq → huniq (251 ⭐)
huniq removes duplicates without sorting. It preserves input order, which is useful for maintaining chronological sequences or priority ordering.
# sort | uniq sort file.txt | uniq # huniq huniq < file.txt
27. strings → stringsext (125 ⭐)
stringsext finds text in binaries across multiple encodings. GNU strings
supports encoding options via -e
, but stringsext
detects and handles Unicode and other encodings out of the box. This tool is essential for analyzing modern binaries that contain UTF-16 strings or non-Western character sets.
# strings strings binary.exe # stringsext stringsext binary.exe
Top comments (3)
19 and 21 are my favorite!!
I see people talk about Rust all the time and now I know where I can begin my exploration!
Procs 🤩