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.
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/fdandgithub.com/sharkdp/bat. After install runfd --versionandbat --version.
Install on macOS and Linux
- 1macOS (Homebrew)
brew install fd bat. Verify withwhich fd batand the version flags. Same formula on Apple Silicon and Intel. - 2Debian / Ubuntu
sudo apt update && sudo apt install fd-find bat. The binary may be namedfdfind; addalias fd=fdfindin your shell or follow the package note to exposefd. Check withfdfind --versionorfd --version. - 3Fedora / Arch
Fedora:
sudo dnf install fd bat. Arch:sudo pacman -S fd bat. If repos lag, grab release binaries from GitHub and put them onPATH. - 4Optional: 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 --followLike 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/*.goTweak 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)
| Goal | Example | Note |
|---|---|---|
| Search inside one extension | fd -e py | xargs rg "def main" | fd narrows to .py, rg searches content |
| Search then highlight | rg -l "TODO" src | xargs bat | rg -l lists files; bat opens each |
| Piped output | rg -n "error" app.log | bat -l log | -l log sets language for highlighting |
| Classic grep | fd -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.