How to install fd and bat on macOS and Linux: find files, syntax cat, pipe with rg

Install fd and bat, run your first find and highlight commands, and chain them with rg.

Searching a repo with find and reading sources with cat gets old fast. fd and bat are Rust-based replacements: fd respects .gitignore while finding paths by name or extension; bat is a syntax-highlighting cat with line numbers and paging. This guide covers install on macOS/Linux, fd file search, bat viewing, and piping with rg/grep for hereink readers who live in the terminal.

The query is how to install fd and bat CLI tools on macOS and Linux. You should finish with both commands installed, a first fd and bat run, and a simple pipeline that finds files then searches or previews them.

fdbrew · apt · dnf
bathighlight · line numbers
combofd · rg · bat

What fd and bat fix

fd instead of daily find

find . -name '*.ts' is verbose and often walks node_modules. fd recurses by default, honors ignore rules, and exposes -e, -t, and case flags—ideal for narrowing a file set before editing or searching.

bat makes cat readable

bat src/main.rs detects language, highlights syntax, shows line numbers, and uses a pager (disable with --paging=never). Configs, logs, and CI snippets are easier to scan than plain cat.

Upstream: github.com/sharkdp/fd and github.com/sharkdp/bat. After install run fd --version and bat --version.

Install on macOS and Linux

  1. 1
    macOS (Homebrew)

    brew install fd bat. Verify with which fd bat and the version flags. Same formula on Apple Silicon and Intel.

  2. 2
    Debian / Ubuntu

    sudo apt update && sudo apt install fd-find bat. The binary may be named fdfind; add alias fd=fdfind in your shell or follow the package note to expose fd. Check with fdfind --version or fd --version.

  3. 3
    Fedora / Arch

    Fedora: sudo dnf install fd bat. Arch: sudo pacman -S fd bat. If repos lag, grab release binaries from GitHub and put them on PATH.

  4. 4
    Optional: Rust

    With Rust installed: cargo install fd-find bat. Slower compile, useful when packages are missing or stale.

Find files with fd

fd config
fd -e tsx
fd -t f README
fd -i dockerfile
fd \.env$ /etc --follow

Like ripgrep, fd reads .gitignore in Git trees. To include ignored paths, see upstream flags such as --no-ignore—expect much more output.

View files with bat

bat src/lib/utils.ts
bat --paging=never Dockerfile
bat -n package.json
bat src/*.go

Tweak theme via ~/.config/bat/config or BAT_THEME; list themes with bat --list-themes. The bat README shows an optional cat alias—only if you want it.

Combine with grep / ripgrep (rg)

GoalExampleNote
Search inside one extensionfd -e py | xargs rg "def main"fd narrows to .py, rg searches content
Search then highlightrg -l "TODO" src | xargs batrg -l lists files; bat opens each
Piped outputrg -n "error" app.log | bat -l log-l log sets language for highlighting
Classic grepfd -e sh | xargs grep -n "set -e"Works without rg; rg is usually faster—see our ripgrep guide on this site
Fits
Monorepo work: configs, scripts, logs; developers who want shorter find syntax and readable terminal previews.
Does not fit
IDE-wide refactor or GUI search. This guide focuses on macOS/Linux package paths; on Windows use scoop/chocolatey per upstream README.
Ubuntu only has fdfind, not fd?

Debian-family packages often ship fd-find with a fdfind binary. Use alias fd=fdfind or a compatibility package that provides the fd name.

Can bat replace cat in scripts?

For human reading, yes. For pipelines that need plain stdout, use bat --paging=never --plain or keep cat so pagers and decorations do not break downstream tools.

fd or find?

Complex mtime, permissions, or -exec jobs stay on find. Quick name/extension lists are shorter with fd. Keep both.

After the terminal search, align on one diagram

Once fd/rg point at modules, service boundaries still belong on one shared board. See how to create a space.

Start a room