Skip to content

fd 替代 find 的使用方法与迁移策略

  • 状态:已验证
  • 来源:对话整理
  • 更新时间:2026-03-20

关键结论

  • fd 适合日常开发中的文件查找,交互简单,默认行为也更贴近日常搜索习惯。
  • find 仍然更适合复杂条件过滤,例如时间、权限和更复杂的布尔组合。
  • 迁移时推荐先用 fd + rg 覆盖大多数 find + grep 场景,再保留 find 处理少量复杂任务。
  • fd PATTERN 默认把模式当作正则表达式,而不是 shell glob。
  • 扩展名查找优先使用 fd -e md,需要精确正则时再使用 fd '\.md$'

详细分析

  • fd 默认递归搜索,并会自动遵循 .gitignore
  • fd 使用更直接的模式匹配方式,不需要像 find 那样频繁写 -name
  • fd 提供 -t 做类型过滤,提供 -x 做结果批量执行,是日常开发中最常用的两类能力。
  • fd 不擅长复杂逻辑表达式,遇到多条件组合时,仍然需要借助 shell 管道或继续使用 find
  • fd ".md" 的语义是“匹配任意位置出现的 任意单字符 + md”,不是“扩展名为 .md”。
  • 正则里的 . 会匹配任意单个字符,因此 imdamdcmdsimd 这类片段都可能命中。
  • 文件名如 unseq_backend_simd.h 之所以会被误匹配,是因为它包含了 imd 片段。
  • 这不是 fd 的 bug,而是把 regex 语义误当成 glob 语义导致的预期偏差。
  • find 迁移到 fd 时,最容易出错的就是模式语义差异。

可执行步骤

  1. 安装 fd,优先使用 cargo
  2. 在 Ubuntu 上如果安装产物是 fdfind,建立 fd 命令别名或软链接。
  3. 先把高频的简单查找从 find 迁移到 fd
  4. 需要内容搜索时,优先把 rg 作为后续过滤工具。
  5. 对时间、权限、复杂逻辑条件保留 find,避免强行替换。

命令 / 配置 / 代码

安装:

bash
cargo install fd-find

Ubuntu 软链接:

bash
ln -s "$(which fdfind)" ~/.cargo/bin/fd

快捷别名:

bash
alias f='fd'

基础查找:

bash
fd ".c"
fd ".c" src

扩展名查找:

bash
fd -e md
fd -e md -t f
fd '\.md$'

类型过滤:

bash
fd -t f
fd -t d

执行命令:

bash
fd ".c" -x grep foo

组合搜索:

bash
rg foo $(fd ".c")

风险与注意事项

  • fd 不适合直接替代所有 find 用法,尤其是时间、权限和复杂布尔表达式。
  • alias find='fd' 可能破坏脚本和既有工具行为,不建议默认全局替换。
  • 迁移策略应该是先替换高频简单场景,再逐步评估剩余的复杂用法。
  • 不要把 fd PATTERN 当成 shell glob 使用,尤其是扩展名匹配场景。
  • 当匹配结果异常变多时,优先检查是否误用了 regex 元字符。
  • 扩展名过滤应优先选择 -e,可读性和可维护性都更好。