如何安装 fd 快速找文件:.gitignore 忽略规则、常用 flags 与 find 对照
安装 fd,读懂 ignore 规则,常用 flags 速查,并知道何时仍用 find。
在 monorepo 里按文件名找配置或源码,find 能办到但语法绕、还容易扫进 node_modules。fd(sharkdp 的 Rust 工具)把「按路径快速列文件」做成默认递归、默认尊重忽略规则的一行命令。本教程专注 macOS/Linux 安装 fd、.gitignore 与 .fdignore 等忽略规则、常用 flags,以及与 find 的对照,面向 hereink 读者与 ripgrep 并用的终端工作流。
检索词是如何安装 fd 快速找文件并理解 gitignore 与 find 区别。读完应能安装 fd、在项目根跑第一条搜索、读懂默认跳过哪些目录,并知道复杂条件何时仍用 find。
fd 解决什么问题
比 find 更短的日常找文件
find . -iname '*config*' 要记住 -iname、引号与起始路径。fd config 默认在当前目录递归,把模式当子串或正则(见 -g)匹配路径,输出一行一个相对路径,适合再管道给 rg、bat 或 xargs。
与 ripgrep 同一套「尊重忽略」
rg 搜内容、fd 圈文件。二者在 Git 仓库里都会读 .gitignore,少扫 dist、target 与依赖目录。站内 bat 教程讲高亮阅读;本篇只讲 fd 找路径。
上游:
github.com/sharkdp/fd。安装后运行fd --version确认。
在 macOS 与 Linux 安装
- 1macOS(Homebrew)
brew install fd。验证:which fd与fd --version。 - 2Debian / Ubuntu
sudo apt update && sudo apt install fd-find。二进制常为fdfind;在 shell 配置里alias fd=fdfind,或按发行版说明启用fd命令名。 - 3Fedora / Arch
Fedora:
sudo dnf install fd。Arch:sudo pacman -S fd。版本偏旧时可从 GitHub Releases 下载对应架构二进制并加入PATH。 - 4可选:Rust 工具链
cargo install fd-find。编译较慢,适合包管理器未提供新版本的环境。
忽略规则:fd 默认跳过什么
在 Git 仓库内,fd 默认启用 ignore 规则,行为与 ripgrep 类似:
- .gitignore:项目与各子目录中的规则;未跟踪但匹配的路径通常也不列出。
- .ignore 与全局 ignore 文件(见
man fd与官方 README 的 ignore 章节)。 - .fdignore:仅 fd 读取,适合「不想改团队 .gitignore,但本地 fd 要再排除一批路径」。
- .git 目录本身默认不参与结果(找文件时不会把
.git/objects当普通文件列出来)。
# 列出会匹配的路径,但仍应用 ignore(正常开发默认)
fd Cargo.toml
# 包含被 .gitignore 忽略的路径(输出会暴增,慎用)
fd --no-ignore vendor
# 不读任何 ignore 文件(含 .gitignore、.fdignore)
fd -I secret
# 仍 respect ignore,但额外匹配隐藏文件/目录(名称以 . 开头)
fd -H .env
# 只搜当前目录一层(不递归)
fd --max-depth 1 Makefile常用 flags 速查
# 按扩展名(不要写点)
fd -e rs
fd -e ts -e tsx
# 只要普通文件 / 目录 / 符号链接
fd -t f README
fd -t d src
fd -t l
# 忽略大小写
fd -i dockerfile
# glob 模式(整段路径匹配)
fd -g '*.min.js'
# 排除路径片段(可重复 -E)
fd -E node_modules -E '*.pyc' test
# 对每条结果执行命令(比裸 xargs 更安全处理空格)
fd -e md -x wc -l {}
# 指定起始目录
fd '\.toml$' ./crates需要跟随符号链接遍历加 -L 或 --follow;只列出目录加 --type directory(同 -t d)。完整列表:fd --help。
fd 与 find 对照
| 目标 | fd | find |
|---|---|---|
| 按名称片段找文件 | fd config | find . -iname '*config*' |
| 按扩展名 | fd -e go | find . -name '*.go' |
| 尊重 .gitignore | 默认开启 | 需配合 git ls-files 或手动 -prune |
| 按修改时间 / 权限 | 不擅长(用 find) | find . -mtime -7、-perm |
| 对每条结果执行删除等 | fd … -x rm {}(先不加 -x 目检) | find … -exec rm {} + |
| 最大深度 | --max-depth N | -maxdepth N |
| 可移植性 | 现代 Unix/macOS 友好;Windows 见官方 | POSIX,脚本里更常见 |
组合示例:fd -e py | xargs rg 'def main' 先圈 Python 再搜内容;含空格路径优先 fd … -x rg pattern {}。
- 适合
- 每天在仓库里按名称/扩展名列文件、写脚本前快速圈定范围、与 rg/bat 同一栈的人。
- 不适合
- 纯按 mtime 清理磁盘、复杂布尔条件或必须在最小容器镜像里只依赖 POSIX 的运维脚本——保留
find。
Ubuntu 只有 fdfind 没有 fd?
包名 fd-find 提供 fdfind。在 ~/.bashrc 或 ~/.zshrc 里 alias fd=fdfind,或安装提供 fd 名称的兼容包。
fd 和站内 fd+bat 教程重复吗?
那篇同时讲 bat 语法高亮 cat 与管道组合;本篇深入 fd 的 ignore 与 find 对照。两篇可互补阅读。
模式是正则还是子串?
默认模式多为子串匹配(取决于版本与是否启用正则选项);要 shell 式 glob 用 -g。拿不准时先不加选项试 fd 片段,再加 -g 或查 fd --help 的 SEARCH 说明。
圈定模块后对齐一张图
用 fd 定位服务或包边界后,架构仍适合摊在同一张白板上。见 如何创建空间。