I stopped using find and grep ages ago. fd and rg (ripgrep) are faster and have better defaults. Switching to these was probably one of the quickest productivity wins I’ve had.

Why they’re faster Link to heading

The main reason is .gitignore support by default. If you’re searching a monorepo with thousands of files, skipping node_modules and .venv automatically makes a massive difference. On my work codebase, rg is easily 5-10x faster than grep -r for common searches.

They’re also written in Rust and heavily optimised. But honestly, the .gitignore behaviour is what makes the real difference day-to-day.

fd Link to heading

Find files by name:

fd pattern

Find Python files only:

fd -e py

Find and delete all .pyc files (destructive):

fd -e pyc -x rm {}

ripgrep Link to heading

Search for a pattern:

rg pattern

Search only in Python files:

rg pattern -t py

Show just filenames:

rg -l pattern

Case insensitive:

rg -i pattern

My shell aliases Link to heading

I’ve aliased these so I don’t even think about the old tools:

alias f='fd'
alias rg='rg --smart-case'  # case-insensitive unless uppercase used

I used to have alias find='fd' but that broke some scripts that expected GNU find syntax, so I just learnt to type fd instead.

Other modern CLI tools worth using Link to heading

Once you start replacing old Unix tools, you realise there’s a whole ecosystem of modern alternatives:

  • bat - cat with syntax highlighting and git integration
  • eza - modern ls replacement (fork of exa)
  • zoxide - smarter cd that learns your habits
  • fzf - fuzzy finder that integrates with everything
  • delta - better git diffs
  • duf - prettier df alternative
  • dust - more intuitive du

I don’t use all of these (I’m fine with regular ls for instance), but bat and fzf have become essential parts of my workflow. The learning curve is minimal because they mostly just work better out of the box.