9 min read

Ditch grep and find: Modern CLI Tools That Make Your Terminal 10x Faster

Developer ToolsProductivityWorkflowBest Practices

Last month I was searching a monorepo with maybe 200,000 files. I typed grep -r "useEffect" and waited. And waited. I got up, refilled my coffee, came back, and the thing was still running. That was the moment I finally decided to modernize my terminal tooling.

Look, I'm not a tooling maximalist. I don't switch editors every six months or chase every shiny new thing on Product Hunt. But when a 40-year-old command is visibly wasting my time every single day, it's hard to justify sticking with it out of habit. Modern CLI tools aren't just faster versions of the same thing — they have better defaults, smarter output, and they play nicely with each other in ways the old Unix utilities never bothered to.

So here's what I replaced, why it matters, and how to set it all up without spending your whole afternoon on dotfiles.

ripgrep Replaces grep

grep was fine in 1985. Today, it's the slowest thing in my workflow. ripgrep (or rg) is a Rust-based search tool that respects your .gitignore by default, so it doesn't waste time crawling node_modules and .git directories. The first time I ran it, I thought it was broken because results appeared instantly.

# Install
brew install ripgrep

# Search recursively (gitignore-aware by default)
rg "useEffect"

# Search only TypeScript files
rg "useEffect" -t ts

# Show context around matches
rg "handleAuth" -C 3

# Case-insensitive, whole-word match
rg -i -w "auth"

The speed difference isn't marginal. On that 200K-file monorepo, a search that took grep over two minutes finishes in under a second. And the output is colorized by default, with file names and line numbers neatly formatted. No more piping through --color=always and praying.

fd Replaces find

find . -name "*.ts" -not -path "*/node_modules/*" — if you've typed this more than once, you know the pain. fd makes it stupid simple. It's also Rust-based, parallelized, and respects .gitignore out of the box.

# Install
brew install fd

# Find all TypeScript files (gitignore-aware)
fd -e ts

# Find by name pattern
fd config

# Find and execute on each result
fd -e json -x rm

# Find files modified in the last 2 days
fd --changed-within 2d

The syntax is just shorter and more memorable. fd -e ts beats find . -name "*.ts" every time, and the colorized output makes it easier to scan at a glance. I honestly can't remember the last time I reached for plain find.

bat Replaces cat

This one feels almost too simple to mention, but bat has quietly become one of my most-used tools. It's cat with syntax highlighting, line numbers, and git integration baked in. When you're peeking at a config file or diffing two versions, the colorized output makes a real difference.

# Install
brew install bat

# View a file with syntax highlighting
bat package.json

# Show only a specific line range
bat package.json -r 20:40

# Use as a drop-in replacement for cat
alias cat="bat"

The git integration is the hidden gem — bat shows you which lines have been modified, added, or deleted right in the gutter. It's like having a mini diff view every time you open a file.

zoxide Replaces cd

If you work in a monorepo, you probably have folder paths burned into your muscle memory. cd ~/projects/mycompany/frontend/src/components/shared/hooks — we've all been there. zoxide learns your most-visited directories and lets you jump to them with a partial name.

# Install
brew install zoxide

# Add to .zshrc
eval "$(zoxide init zsh)"

# Jump to a directory by partial name
z hooks
# Takes you to .../shared/hooks if that's where you've been

# Jump with interactive selection
zi

# Replace cd entirely
zoxide init zsh --cmd cd

After a week of normal use, zoxide builds a frequency-based ranking of your directories. z hooks just works. z comp jumps to components. It saves me maybe 30 seconds a day, which doesn't sound like much until you multiply it across a year.

fzf Ties Everything Together

Here's where it gets fun. fzf is a general-purpose fuzzy finder that can pipe into anything — file search, command history, git branches, process lists. Once you wire it up with the tools above, your terminal becomes genuinely fast in a way that feels different.

# Install
brew install fzf

# Add to .zshrc
source <(fzf --zsh)

# Use fd instead of find for file listing
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

# Search file contents with ripgrep, preview with bat
export FZF_DEFAULT_OPTS='
  --preview "bat --color=always --style=numbers {}"
  --bind "ctrl-/:toggle-preview"
'

Now Ctrl+T opens a fuzzy file picker powered by fd, with a live preview powered by bat. Ctrl+R gives you fuzzy command history search. Alt+C does fuzzy directory jumping with zoxide. It's the kind of setup where, once you've used it for a week, going back to a vanilla terminal feels like typing with mittens on.

Wiring It All Up

Here's the full .zshrc block I use. Copy it, paste it, and you're done:

# Modern CLI tools
eval "$(zoxide init zsh)"
source <(fzf --zsh)

export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --exclude .git'
export FZF_DEFAULT_OPTS='--preview "bat --color=always --style=numbers {}"'

alias cat="bat"
alias find="fd"
alias grep="rg"

One thing I'd suggest: save this snippet somewhere you can find it again. I keep all my shell configs and CLI setup snippets in Snippet Ark so I don't have to go spelunking through old dotfile repos when I set up a new machine. Having a single searchable place for "that one config I always paste" has saved me more time than the tools themselves.

Do You Actually Need All of These?

Honestly? You don't need all five on day one.

If you're doing one thing this week, install ripgrep. It's the single biggest speed win, and you can start using it immediately without changing any habits. fd and bat are close seconds — they're drop-in replacements that just make everything a little nicer.

zoxide and fzf take a day or two to internalize, but once they click, you'll wonder how you worked without them. The fuzzy directory jump alone changed how I navigate projects.

The point isn't to collect tools. It's to remove friction from the stuff you do fifty times a day. If grep works fine for your 500-file project, keep using it. But if you're searching large codebases, managing multiple projects, or just tired of typing long paths — these tools compound. Each one removes a small annoyance, and together they make your terminal feel fast and responsive in a way that's hard to describe until you experience it.

And if you want somewhere to stash all your new dotfile configs, Snippet Ark works offline and syncs when you're ready. No cloud dependency, no account required to start — just a clean place to keep the commands you keep re-Googling.