[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"post-content-modern-cli-tools-replace-unix-commands":3},"\u003Cp>Last month I was searching a monorepo with maybe 200,000 files. I typed \u003Ccode>grep -r \"useEffect\"\u003C\u002Fcode> and waited. And waited. I got up, refilled my coffee, came back, and the thing was \u003Cem>still\u003C\u002Fem> running. That was the moment I finally decided to modernize my terminal tooling.\u003C\u002Fp>\n\n\u003Cp>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.\u003C\u002Fp>\n\n\u003Cp>So here's what I replaced, why it matters, and how to set it all up without spending your whole afternoon on dotfiles.\u003C\u002Fp>\n\n\u003Ch2>ripgrep Replaces grep\u003C\u002Fh2>\n\n\u003Cp>\u003Ccode>grep\u003C\u002Fcode> was fine in 1985. Today, it's the slowest thing in my workflow. \u003Ccode>ripgrep\u003C\u002Fcode> (or \u003Ccode>rg\u003C\u002Fcode>) is a Rust-based search tool that respects your \u003Ccode>.gitignore\u003C\u002Fcode> by default, so it doesn't waste time crawling \u003Ccode>node_modules\u003C\u002Fcode> and \u003Ccode>.git\u003C\u002Fcode> directories. The first time I ran it, I thought it was broken because results appeared instantly.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Install\nbrew install ripgrep\n\n# Search recursively (gitignore-aware by default)\nrg \"useEffect\"\n\n# Search only TypeScript files\nrg \"useEffect\" -t ts\n\n# Show context around matches\nrg \"handleAuth\" -C 3\n\n# Case-insensitive, whole-word match\nrg -i -w \"auth\"\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>The speed difference isn't marginal. On that 200K-file monorepo, a search that took \u003Ccode>grep\u003C\u002Fcode> 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 \u003Ccode>--color=always\u003C\u002Fcode> and praying.\u003C\u002Fp>\n\n\u003Ch2>fd Replaces find\u003C\u002Fh2>\n\n\u003Cp>\u003Ccode>find . -name \"*.ts\" -not -path \"*\u002Fnode_modules\u002F*\"\u003C\u002Fcode> — if you've typed this more than once, you know the pain. \u003Ccode>fd\u003C\u002Fcode> makes it stupid simple. It's also Rust-based, parallelized, and respects \u003Ccode>.gitignore\u003C\u002Fcode> out of the box.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Install\nbrew install fd\n\n# Find all TypeScript files (gitignore-aware)\nfd -e ts\n\n# Find by name pattern\nfd config\n\n# Find and execute on each result\nfd -e json -x rm\n\n# Find files modified in the last 2 days\nfd --changed-within 2d\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>The syntax is just shorter and more memorable. \u003Ccode>fd -e ts\u003C\u002Fcode> beats \u003Ccode>find . -name \"*.ts\"\u003C\u002Fcode> 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 \u003Ccode>find\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>bat Replaces cat\u003C\u002Fh2>\n\n\u003Cp>This one feels almost too simple to mention, but \u003Ccode>bat\u003C\u002Fcode> has quietly become one of my most-used tools. It's \u003Ccode>cat\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Install\nbrew install bat\n\n# View a file with syntax highlighting\nbat package.json\n\n# Show only a specific line range\nbat package.json -r 20:40\n\n# Use as a drop-in replacement for cat\nalias cat=\"bat\"\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>The git integration is the hidden gem — \u003Ccode>bat\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Ch2>zoxide Replaces cd\u003C\u002Fh2>\n\n\u003Cp>If you work in a monorepo, you probably have folder paths burned into your muscle memory. \u003Ccode>cd ~\u002Fprojects\u002Fmycompany\u002Ffrontend\u002Fsrc\u002Fcomponents\u002Fshared\u002Fhooks\u003C\u002Fcode> — we've all been there. \u003Ccode>zoxide\u003C\u002Fcode> learns your most-visited directories and lets you jump to them with a partial name.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Install\nbrew install zoxide\n\n# Add to .zshrc\neval \"$(zoxide init zsh)\"\n\n# Jump to a directory by partial name\nz hooks\n# Takes you to ...\u002Fshared\u002Fhooks if that's where you've been\n\n# Jump with interactive selection\nzi\n\n# Replace cd entirely\nzoxide init zsh --cmd cd\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>After a week of normal use, \u003Ccode>zoxide\u003C\u002Fcode> builds a frequency-based ranking of your directories. \u003Ccode>z hooks\u003C\u002Fcode> just works. \u003Ccode>z comp\u003C\u002Fcode> jumps to \u003Ccode>components\u003C\u002Fcode>. It saves me maybe 30 seconds a day, which doesn't sound like much until you multiply it across a year.\u003C\u002Fp>\n\n\u003Ch2>fzf Ties Everything Together\u003C\u002Fh2>\n\n\u003Cp>Here's where it gets fun. \u003Ccode>fzf\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Install\nbrew install fzf\n\n# Add to .zshrc\nsource \u003C(fzf --zsh)\n\n# Use fd instead of find for file listing\nexport FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'\nexport FZF_CTRL_T_COMMAND=\"$FZF_DEFAULT_COMMAND\"\n\n# Search file contents with ripgrep, preview with bat\nexport FZF_DEFAULT_OPTS='\n  --preview \"bat --color=always --style=numbers {}\"\n  --bind \"ctrl-\u002F:toggle-preview\"\n'\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Now \u003Ccode>Ctrl+T\u003C\u002Fcode> opens a fuzzy file picker powered by \u003Ccode>fd\u003C\u002Fcode>, with a live preview powered by \u003Ccode>bat\u003C\u002Fcode>. \u003Ccode>Ctrl+R\u003C\u002Fcode> gives you fuzzy command history search. \u003Ccode>Alt+C\u003C\u002Fcode> does fuzzy directory jumping with \u003Ccode>zoxide\u003C\u002Fcode>. 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.\u003C\u002Fp>\n\n\u003Ch2>Wiring It All Up\u003C\u002Fh2>\n\n\u003Cp>Here's the full \u003Ccode>.zshrc\u003C\u002Fcode> block I use. Copy it, paste it, and you're done:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-bash\"># Modern CLI tools\neval \"$(zoxide init zsh)\"\nsource \u003C(fzf --zsh)\n\nexport FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'\nexport FZF_CTRL_T_COMMAND=\"$FZF_DEFAULT_COMMAND\"\nexport FZF_ALT_C_COMMAND='fd --type d --hidden --exclude .git'\nexport FZF_DEFAULT_OPTS='--preview \"bat --color=always --style=numbers {}\"'\n\nalias cat=\"bat\"\nalias find=\"fd\"\nalias grep=\"rg\"\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>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 \u003Ca href=\"\u002Fsnippetark\u002F\">Snippet Ark\u003C\u002Fa> 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.\u003C\u002Fp>\n\n\u003Ch2>Do You Actually Need All of These?\u003C\u002Fh2>\n\n\u003Cp>Honestly? You don't need all five on day one.\u003C\u002Fp>\n\n\u003Cp>If you're doing one thing this week, install \u003Ccode>ripgrep\u003C\u002Fcode>. It's the single biggest speed win, and you can start using it immediately without changing any habits. \u003Ccode>fd\u003C\u002Fcode> and \u003Ccode>bat\u003C\u002Fcode> are close seconds — they're drop-in replacements that just make everything a little nicer.\u003C\u002Fp>\n\n\u003Cp>\u003Ccode>zoxide\u003C\u002Fcode> and \u003Ccode>fzf\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Cp>The point isn't to collect tools. It's to remove friction from the stuff you do fifty times a day. If \u003Ccode>grep\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Cp>And if you want somewhere to stash all your new dotfile configs, \u003Ca href=\"\u002Fsnippetark\u002F\">Snippet Ark\u003C\u002Fa> 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.\u003C\u002Fp>\n",1787133717892]