揭秘fd的智能默认行为:隐藏文件与.gitignore机制如何让文件查找又快又干净
【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd
fd 是一款简单、快速且对新手友好的文件查找工具,是传统 find 命令的现代替代品。本文带你揭秘 fd 的智能默认行为:它默认跳过隐藏文件、自动遵循 .gitignore 忽略规则,这正是 fd 文件查找又快又干净的秘密所在。
为什么 fd 的搜索结果"天生干净"?😄
用find查找文件时,你往往要加一堆参数(-iname、-path、-not)才能过滤掉.git目录和target构建产物,而 fd 一条命令都不用加。原因在于 fd 出厂就内置了两套智能默认机制:
- 默认跳过隐藏文件——名字以
.开头的文件和目录(如.git、.bashrc)一律不出现在结果里; - 默认遵循 .gitignore——被 Git 忽略的路径(如编译产物、依赖目录)直接被整棵子树剪枝。
这背后不是简单的"字符串匹配过滤",而是在目录遍历阶段就跳过无关节点,配合多线程并行遍历(基准测试中比 find 快 13~23 倍),搜索因此又快又干净。这些开关都集中在 src/config.rs 的Config结构体中定义。
机制一:默认跳过隐藏文件(-H 一键开启)
fd 判断"隐藏"的规则很简单:文件名以点.开头。默认的fd 关键字搜索会直接跳过所有隐藏文件和目录,连.git内部都不会进入。
想找回隐藏文件时,加上-H(--hidden)即可:
fd pre-commit # 什么都搜不到 fd -H pre-commit # 命中 .git/hooks/pre-commit.sample在源码层面,这个开关对应 src/config.rs 的ignore_hidden字段,并在 src/walk.rs 的build_walker函数中传给底层遍历器的.hidden(...)接口——意味着 fd 在遍历目录时就跳过隐藏节点,而不是找到后再丢弃,这是它提速的关键之一。
💡 小提示:
-H也可以用--no-hidden显式关闭,方便在脚本中强制回到默认行为。
机制二:自动遵循 .gitignore,让构建产物"隐身"
在 Git 仓库中工作时,fd 会默认读取.gitignore规则,被忽略的目录(如 Rust 项目的target/)整棵子树都不会被进入:
fd num_cpu # 被 .gitignore 屏蔽,无结果 fd -I num_cpu # 加 -I 后,target 下的编译产物也现身三层忽略文件体系,你只需要知道这些
fd 的忽略体系由 src/walk.rs 中的build_walker统一装配,按优先级组合了以下几类规则:
| 忽略文件 | 作用范围 | 默认是否生效 |
|---|---|---|
.gitignore | 当前及子目录的 Git 忽略规则 | ✅ 仅当处于 Git 仓库内 |
.git/info/exclude与全局 gitignore | Git 的本地/全局排除规则 | ✅ 同上 |
.fdignore | fd 专属忽略文件,语法同 .gitignore | ✅ |
.ignore | ripgrep/ag 风格的忽略文件 | ✅ |
~/.config/fd/ignore | fd 全局忽略文件 | ✅ |
一个容易被忽略的细节:默认情况下,fd只在检测到.git目录时才启用 .gitignore 规则(require_git机制,见 src/cli.rs)。如果你的目录不是 Git 仓库却也想让.gitignore生效,加上--no-require-git即可。
-I 与 -u:两种"解禁"姿势
-I(--no-ignore):只关闭 ignore 规则,隐藏文件依然跳过,适合"在忽略区里找东西"。-u(--unrestricted):等价于-H -I的组合,彻底无限制搜索,排查"文件去哪了"时的终极手段。
两个开关的完整定义可参考 src/cli.rs,官方使用示例见 README.md。
实用技巧:把忽略规则沉淀为持久配置
与其每次敲-E排除参数,不如把规则写进忽略文件,一劳永逸:
项目级:在目录里创建.fdignore文件(语法与 .gitignore 完全一致),例如写入target/、*.bak,之后在该目录使用 fd 时自动生效。
全局级:在~/.config/fd/ignore中写入想永久排除的路径(如外部挂载盘)。README 还推荐把.git/加进全局忽略文件,这样即使使用-H搜索隐藏文件,也不会被.git内部的海量文件刷屏。
📌 相关文档:fd 的完整参数手册见 doc/fd.1,其中对
.fdignore与全局忽略文件的说明见 doc/fd.1。
隐藏文件与 ignore 机制参数速查表 ⚡
| 场景 | 命令 | 行为 |
|---|---|---|
| 默认搜索 | fd 关键字 | 跳过隐藏文件 + 遵循 .gitignore |
| 搜索隐藏文件 | fd -H 关键字 | 包含.git、.config等 |
| 显示被忽略文件 | fd -I 关键字 | 忽略所有 ignore 规则 |
| 无限制搜索 | fd -u 关键字 | 等价于-H -I,全部可见 |
| 只关 Git 规则 | fd --no-ignore-vcs 关键字 | 仍遵循 .fdignore/.ignore |
| 非仓库也读 .gitignore | fd --no-require-git 关键字 | 取消.git目录检测要求 |
| 不排除父目录规则 | fd --no-ignore-parent 关键字 | 仅用当前目录的忽略规则 |
小结
fd 的"智能"不靠复杂配置,而靠恰到好处的默认值:隐藏文件默认跳过、.gitignore 默认生效,让 90% 的查找场景一条命令搞定;当你需要"看见一切"时,-H、-I、-u三个开关随时可以精确解禁。理解这套机制后,fd 就会成为你终端里又快又干净的文件查找搭档 🚀
【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考