← All Posts
17 March 2026 by Daniel
RustCLIDevOps

I did not set out to replace all my CLI tools. It happened gradually. Someone on a project mentioned exa and I tried it. Then fd. Then I kept going and at some point I realised almost everything I type into a terminal daily is now written in Rust.

I do not particularly care what language my tools are written in. But these are all fast, the defaults are sensible, and I have stopped looking up flags I have been looking up for fifteen years. That is enough for me.

exa (now eza)

exa was a replacement for ls. The original project stopped being maintained so it got forked as eza, which is what you should install now.

The thing that sold me was not the colours, though those are nice. It was eza -l --git. That gives you a file listing with git status inline. Modified files, staged files, ignored files, all visible without switching context. I used to run ls -la then git status then go back. Now it is one command.

eza --tree is the other one I use constantly. Recursive directory listing in a tree format with sensible defaults. No more find . -type d piped through something to make it readable.

I aliased ls to eza about a year ago. I have not missed the original once.

bat

cat with syntax highlighting and line numbers. I could stop there but the pager integration is what actually made me keep it. If the output is longer than your terminal, bat pages it automatically with search built in. No more cat file.py | less. Just bat file.py.

It also handles git diffs. bat --diff shows you what changed in a file with proper highlighting. I use it in code reviews when I want a quick look at something without opening an editor.

fd

fd replaces find. If you have ever written find . -name "*.yaml" -type f -not -path "./node_modules/*" and thought there has to be a better way, there is.

The equivalent in fd is fd -e yaml. That is it. It ignores .gitignore patterns by default, so node_modules and .git and build directories just disappear from results. It also searches in parallel, which matters when you are searching large codebases.

I use it dozens of times a day. Finding config files, hunting for that one template that has a specific extension, cleaning up temp files. Every time I go back to a machine without fd installed I feel it immediately.

procs

procs replaces ps. It gives you a process listing with colour, tree view, and columns you can actually configure without memorising ps format strings.

procs --tree shows parent-child process relationships in a way that makes sense. Useful when you are trying to work out why a container is spawning unexpected child processes or when something is eating CPU and you want to trace it back to the parent.

The search is good too. procs nginx finds every nginx process without grep. On a server with a hundred processes running, that matters more than it sounds.

doggo

I used to use dog for DNS lookups, but the original project has not been updated since 2020. doggo is the actively maintained alternative, written in Go rather than Rust but worth including here because it fills the same gap.

Think dig but with output that a human can actually read. doggo example.com A AAAA MX gives you all the record types in a clean table. No more parsing dig output and trying to remember which section is the answer and which is the authority.

I use it when debugging DNS during migrations. When a client’s site is not resolving and I need to check what their records are doing across different nameservers, doggo makes that fast. doggo example.com A @8.8.8.8 @1.1.1.1 and you get both answers side by side.

ripgrep

Everyone knows about rg at this point so I will keep this short. If you are still using grep on codebases, you are wasting time. rg is faster by an embarrassing margin, respects .gitignore, and the output is coloured and grouped by file.

On the monorepos I work on, grep takes minutes. rg takes seconds. I timed it once out of curiosity and stopped bothering with grep after that.

Installing all of them

On macOS: brew install eza bat fd procs doggo ripgrep. On Ubuntu, most are in apt or available through cargo install.

If you only try two, make it fd and bat. Those changed my day the most. I aliased the originals and forgot about them.

Want to talk about this?

If something here is relevant to what you are working on, we are happy to chat.

Get In Touch