fd 速查表
fd 是一个基于 Rust 的超快速文件搜索工具,是传统 find 命令的现代替代品。默认采用正则表达式搜索文件名,自动忽略 .gitignore 和隐藏文件,支持扩展名过滤、时间过滤、大小过滤以及并行执行命令。43K+ GitHub Stars。
快速入门
``bash
fd 'config.json' # 按文件名搜索(正则)
fd -e py # 查找所有 Python 文件
fd -t d 'src' # 查找 src 目录
fd -H '.env' # 包含隐藏文件
fd -e log -x rm # 删除所有日志文件
fd --changed-within 1week # 最近一周修改的文件
`
基础搜索
使用正则表达式按名称搜索文件和目录。fd 默认不区分大小写,从当前目录递归搜索。
`bash
fd 'config.json' # 正则搜索匹配的文件名
fd -s 'Config' # 区分大小写搜索
fd -i 'readme' # 显式不区分大小写
fd -g '*.log' # 使用 glob 模式代替正则
fd -d 3 'main' # 限制搜索深度为 3 层
fd --search-path /var/log # 从指定根目录搜索
fd --absolute-path 'config' # 输出绝对路径
fd --full-path 'src/.*test' # 匹配完整路径而非文件名
`
过滤选项
按扩展名、文件类型、大小、时间和排除模式进行强大过滤。
`bash
fd -e py # 仅搜索 Python 文件
fd -t f 'config' # 仅搜索文件
fd -t d 'src' # 仅搜索目录
fd -t l 'link' # 仅搜索符号链接
fd -E 'node_modules' -e js # 排除 node_modules 目录
fd --size '+100MB' # > 100MB 的大文件
fd --size '-1KB' # < 1KB 的小文件
fd --changed-within '1week' # 最近一周内修改的文件
fd --changed-before '2024-01-01' # 指定日期前修改的文件
fd --changed-within '30min' # 最近 30 分钟内修改的文件
`
执行命令
在搜索结果上运行命令,支持灵活的占位符语法。
`bash
fd -e py -x wc -l # 统计每个 Python 文件的行数
fd -e jpg -x convert {} {.}.png # JPG 转 PNG({} 完整路径,{.} 无后缀)
fd -e txt -X cat # 批量:一次性 cat 所有 txt 文件
fd -e py --exec-batch chmod +x # 显式批量执行
fd -e log --exec rm {} + # 并行执行(类似 find -exec +)
fd -e mp3 -x mv {} /backup/ # 移动文件到备份目录
fd -0 -e py | xargs -0 wc -l # NUL 分隔输出配合 xargs
`
高级选项
精细控制 fd 的行为:隐藏文件、符号链接、忽略规则和并行度。
`bash
fd -H '.env' # 包含隐藏和被 .gitignore 忽略的文件
fd -L 'data' # 跟随符号链接
fd --no-ignore 'secret' # 忽略 .gitignore 规则
fd --no-ignore-vcs 'config' # 仅忽略 VCS 忽略规则
fd --no-ignore-parent 'output' # 不读取父目录的 .gitignore
fd --color always 'pattern' # 强制彩色输出
fd -j 8 -e py # 使用 8 个并行线程
fd -0 -e py | xargs -0 wc -l # NUL 分隔输出配合 xargs -0
`
专家技巧
`bash
# 查找最近一周修改过的 >100MB 大文件
fd -H --size '+100MB' --changed-within '1week' -t f
# 批量重命名:将所有文件名中的空格替换为下划线 fd -g '* *' -x bash -c 'mv "$1" "${1// /_}"' _ {}
# 递归统计所有 Python 文件的总行数 fd -e py -X wc -l
# 将所有匹配文件复制到目标目录 fd -e pdf -x cp {} /target/
# 交互式删除(配合 fzf 预览后选择) fd -e log -0 | fzf --read0 --multi | xargs -0 rm
# 查找文件系统中的断链符号链接 fd -t l -L -s -H . | while read -r link; do [ ! -e "$link" ] && echo "$link"; done ``
基本搜索(10)
| 命令 | 难度 | ||
|---|---|---|---|
fd --help显示 fd 帮助 | 基础 | fd --help | |
fd PATTERN递归搜索文件名匹配 PATTERN 的文件 | 基础 | fd 'config.json' | |
fd -s区分大小写(默认不区分) | 基础 | fd -s 'Config' | |
fd -i不区分大小写(显式指定) | 基础 | fd -i 'readme' | |
fd -g PATTERN使用全局模式匹配(而非正则) | 中级 | fd -g '*.log' | |
fd -H搜索隐藏文件和 .gitignore 忽略的文件 | 中级 | fd -H '.env' | |
fd -d N限制最大搜索深度 | 基础 | fd -d 3 'main' | |
fd --full-path在全路径上匹配(而非仅文件名) | 中级 | fd --full-path 'src/.*test' | |
fd --absolute-path输出绝对路径 | 基础 | fd --absolute-path 'config' | |
fd --search-path DIR指定搜索根目录 | 基础 | fd --search-path /var/log error.log |
过滤选项(8)
| 命令 | 难度 | ||
|---|---|---|---|
fd -e EXT按文件扩展名过滤 | 基础 | fd -e py | |
fd -t f只搜索文件(不含目录) | 基础 | fd -t f 'config' | |
fd -t d只搜索目录 | 基础 | fd -t d 'src' | |
fd -t l搜索符号链接 | 中级 | fd -t l 'link' | |
fd -E PATTERN排除匹配模式的文件 | 基础 | fd -E 'node_modules' -e js | |
fd --changed-within DURATION查找最近 N 时间内修改过的文件 | 中级 | fd --changed-within '1week' -e md | |
fd --changed-before DURATION查找在某个时间点前修改过的文件 | 中级 | fd --changed-before '2024-01-01' | |
fd --size SIZE按文件大小过滤 | 中级 | fd --size '+100MB' |
执行操作(5)
| 命令 | 难度 | ||
|---|---|---|---|
fd PATTERN -x CMD对每个搜索结果执行命令 | 基础 | fd -e py -x wc -l | |
fd PATTERN -x CMD {}使用 {} 占位符指定参数位置 | 中级 | fd -e jpg -x convert {} {.}.png | |
fd PATTERN -X CMD批量执行(所有结果作为一次调用) | 中级 | fd -e txt -X cat | |
fd PATTERN --exec-batch CMD显式批量执行命令 | 中级 | fd -e py --exec-batch chmod +x | |
fd PATTERN --exec CMD {} +并行执行(类似 find -exec +) | 高级 | fd -e log --exec rm {} + |
高级用法(7)
| 命令 | 难度 | ||
|---|---|---|---|
fd -L跟随符号链接 | 中级 | fd -L 'data' | |
fd --no-ignore忽略 .gitignore 规则 | 中级 | fd --no-ignore 'secret' | |
fd --no-ignore-vcs忽略 VCS 忽略规则(保留 .gitignore 目录过滤) | 高级 | fd --no-ignore-vcs 'config' | |
fd --no-ignore-parent不读取父目录的 .gitignore | 高级 | fd --no-ignore-parent 'output' | |
fd -0用 NUL 字符分隔输出(配合 xargs -0) | 高级 | fd -e py -0 | xargs -0 wc -l | |
fd --color always强制彩色输出(即使管道输出) | 中级 | fd --color always 'pattern' | |
fd -j N设置并行线程数 | 中级 | fd -j 8 -e py |