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 (2)
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!