Appearance
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”。- 正则里的
.会匹配任意单个字符,因此imd、amd、cmd、simd这类片段都可能命中。 - 文件名如
unseq_backend_simd.h之所以会被误匹配,是因为它包含了imd片段。 - 这不是
fd的 bug,而是把 regex 语义误当成 glob 语义导致的预期偏差。 - 从
find迁移到fd时,最容易出错的就是模式语义差异。
可执行步骤
- 安装
fd,优先使用cargo。 - 在 Ubuntu 上如果安装产物是
fdfind,建立fd命令别名或软链接。 - 先把高频的简单查找从
find迁移到fd。 - 需要内容搜索时,优先把
rg作为后续过滤工具。 - 对时间、权限、复杂逻辑条件保留
find,避免强行替换。
命令 / 配置 / 代码
安装:
bash
cargo install fd-findUbuntu 软链接:
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,可读性和可维护性都更好。