10 terminal tools so good you'll close your GUI (ripgrep 14.7× faster than grep, measured live)

10 terminal tools so good you'll close your GUI (ripgrep 14.7× faster than grep, measured live) — cover

Ten terminal tools that replace a GUI, all free and open source, shown live on one Mac mini. This is the write-up of the video above: the exact commands, what they printed, and how the one benchmark in it was measured. Install everything in one line:

brew install ripgrep fzf bat eza zoxide jq tmux entr gum btop

1. ripgrep: search stops being a coffee break

Same search over a node_modules tree of 19,299 files, grep versus ripgrep, timed with hyperfine (one warm-up run, three timed runs):

$ rg --files node_modules | wc -l
   19299
$ hyperfine -w 1 -r 3 'rg -l useState node_modules' 'grep -rl useState node_modules'
Benchmark 1: rg -l useState node_modules
  Time (mean ± σ):     229.6 ms ±   4.2 ms    [User: 53.9 ms, System: 1868.6 ms]
  Range (min … max):   225.7 ms … 234.1 ms    3 runs

Benchmark 2: grep -rl useState node_modules
  Time (mean ± σ):      3.381 s ±  0.036 s    [User: 2.807 s, System: 0.572 s]
  Range (min … max):    3.358 s …  3.423 s    3 runs

Summary
  rg -l useState node_modules ran
   14.72 ± 0.31 times faster than grep -rl useState node_modules

3.4 s against 230 ms. ripgrep also respects .gitignore and skips node_modules by default when you search a project, which is usually what you wanted anyway. hyperfine printed a warning that the first grep run was slower than the rest; that is the filesystem cache filling, and the warm-up run exists for exactly that reason.

2. fzf: three letters, any file, instantly

Pipe anything into it and type a few sloppy letters. Here, every path under node_modules collapses to the one meant:

$ fd . node_modules | fzf
node_modules/react-dom/client.js

Typing react dom client was enough. Bind fzf to Ctrl+R and your shell history search is fixed too.

3. bat: cat with a brain

Syntax highlighting, line numbers, git changes in the margin.

bat --paging=never --line-range 1:20 src/Root.jsx

The output is the same file cat shows, with a header, numbered lines and colour. Alias cat to bat and reading code stops hurting.

4. eza: ls, redesigned

Icons, git status next to every file, and a tree view. Zero config.

$ eza -la --icons --git src
.rw-r--r--@ 4.9k smkim 21 Aug 01:47  Brand.jsx
.rw-r--r--@  11k smkim 23 Aug 23:14  FlexShort.jsx
.rw-r--r--@  104 smkim 20 Aug 22:56  index.js
.rw-r--r--@  12k smkim 28 Aug 13:42  LongForm.jsx
.rw-r--r--@ 7.4k smkim 23 Aug 17:02  NewsShort.jsx
.rw-r--r--@ 2.9k smkim 28 Aug 12:50  Root.jsx
.rw-r--r--@ 8.3k smkim 21 Aug 01:11  Short.jsx

eza --tree replaces opening Finder to see a folder's shape.

5. zoxide: cd with memory

It learns every directory you visit. Type z plus a few letters and you are standing in that deep folder.

$ z music
$ pwd
/Users/smkim/music
$ z src
$ pwd
/Users/smkim/automoney/remotion-shorts/src

src matched the one you use most, three levels down, without a path.

6. jq: JSON, finally readable

Filter, map and reshape any JSON in one line.

$ jq '.dependencies | keys' package.json
[
  "@remotion/cli",
  "@remotion/google-fonts",
  "react",
  "react-dom",
  "remotion"
]

The video pipes cat package.json into jq. A viewer pointed out that jq takes the file as an argument, so the line above is the corrected form.

7. tmux: close the laptop, nothing dies

Split panes are nice. The real feature is detach.

tmux new -s work        # start a session
./build.sh              # something long-running
Ctrl+B %                # split, run ./api.sh in the second pane
Ctrl+B d                # detach: both keep running
tmux attach             # later, from anywhere: everything is still there

In the video, a 900-module build and an API log run side by side, the session is detached and reattached, and neither process noticed.

8. entr: save, tests run themselves

Pipe in the files to watch, give it one command. Every save runs it.

$ ls app.py | entr -c ./test.sh
running 12 tests...
  ✓ auth_test
  ✓ api_test
  ✓ parser_test
  ✓ cache_test

12 passed in 0.8s

No config, no plugins. -c clears the screen between runs. That is the whole product.

9. gum 2.0: bash scripts that look like real apps

Menus, spinners and inputs drawn in the terminal, scripted from plain bash.

gum choose 'deploy to prod' 'rollback' 'run tests first' 'blame the intern'
gum spin --spinner dot --title 'deploying v2.1.0...' -- sleep 2.5
gum style --foreground 212 --border rounded --padding "1 3" "v2.1.0 is live"

Three lines and a deploy script has a menu, a spinner and a framed result. Version 2 had just shipped when the video was recorded.

10. btop: one dashboard for everything

CPU per core with temperatures, memory, swap, disks, network, processes, at full frame rate. On this Mac mini it showed 12 cores, 48 GiB of memory with 11.9 GiB used, and a 509-process list sorted by CPU. Activity Monitor can retire. And yes, it is judging your Chrome tabs.

btop

How the number was measured

The only benchmark in the video is ripgrep versus grep: 19,299 files, hyperfine with one warm-up and three timed runs, on a Mac mini M4 Pro. Everything else is a live capture with no timing claimed. If one of these goes into your setup first, ripgrep and fzf pay for themselves the same day.

Related posts

Comments

Popular posts from this blog

npm command not found on Windows: fix the PATH

Claude CLI 401 Unauthorized Refresh Token Issue

Tailscale without sudo: what userspace mode actually costs you