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 -
catwith syntax highlighting and git integration - eza - modern
lsreplacement (fork ofexa) - zoxide - smarter
cdthat learns your habits - fzf - fuzzy finder that integrates with everything
- delta - better git diffs
- duf - prettier
dfalternative - 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.
Links Link to heading
- fd documentation
- ripgrep documentation
- ripgrep user guide - worth reading to learn the more advanced features