Loading... # fd 文件查找工具快速入门指南 # 一、概述 ## 1. 简介 ### A. 是什么 fd 是一个用 Rust 编写的命令行文件查找工具,旨在成为传统 Unix find 命令的简单、快速且用户友好的替代品。它不追求支持 find 的全部强大功能,而是为大多数使用场景提供合理的默认配置。 ### B. 为什么学 - 速度极快:并行目录遍历,比传统 find 快 10-20 倍 - 语法简洁:fd PATTERN 即可,无需记忆复杂的 find 参数 - 智能默认:自动忽略隐藏文件和 gitignore 中的文件 - 彩色输出:像 ls 一样用颜色区分不同文件类型 - 易用性强:支持正则表达式和 glob 模式匹配 ### C. 学完能做什么 - 快速在文件系统中查找文件和目录 - 按扩展名、文件类型、大小等条件过滤 - 批量执行命令处理搜索结果 - 与 fzf、ripgrep 等工具集成使用 ## 2. 前置知识 ### A. 必备技能 - 基本 Linux/Unix 命令行操作 - 了解文件系统目录结构概念 ### B. 推荐知识 - 正则表达式基础 - 熟悉 shell 通配符 # 二、环境准备 ## 1. 系统要求 - Linux:Ubuntu、Debian、Fedora、Arch 等 - macOS:10.15+ - Windows:10/11 ## 2. 安装步骤 Ubuntu/Debian: ```bash # Ubuntu 19.04+ 或 Debian Buster+ apt install fd-find # 创建软链接以便使用 fd 命令 ln -s $(which fdfind) ~/.local/bin/fd ``` macOS: ```bash # 使用 Homebrew brew install fd # 或使用 MacPorts port install fd ``` Windows: ```bash # 使用 Scoop scoop install fd # 或使用 Chocolatey choco install fd # 或使用 Winget winget install sharkdp.fd ``` 从源码编译: ```bash # 使用 cargo 安装 cargo install fd-find # 或从源码构建 git clone https://github.com/sharkdp/fd cd fd cargo build cargo install --path . ``` ## 3. 验证安装 ```bash fd --version ``` # 三、核心概念 ## 1. 基本术语 - 模式(Pattern):用于匹配文件名的正则表达式或 glob 模式 - 智能大小写(Smart Case):默认不区分大小写,包含大写字母时自动区分 - 并行遍历:同时搜索多个目录以提高速度 ## 2. 工作原理 ```mermaid graph TB A[fd 命令] --> B{解析参数} B --> C[并行遍历目录] C --> D{应用过滤规则} D --> E{正则/glob 匹配} E --> F{检查隐藏文件} F --> G{检查 gitignore} G --> H[输出结果] ```  ## 3. 与 find 的对比 | 特性 | fd | find | |------|-----|------| | 基本语法 | fd PATTERN | find -iname '*PATTERN*' | | 速度 | 并行遍历,极快 | 串行遍历,较慢 | | 默认行为 | 忽略隐藏和 gitignore 文件 | 搜索所有文件 | | 大小写 | 智能判断 | 需手动指定 | | 彩色输出 | 默认支持 | 需额外配置 | # 四、快速上手 ## 1. Hello World 示例 ```bash # 查找包含 'netfl' 的文件 fd netfl # 输出: # Software/python/imdb-ratings/netflix-details.py ``` ## 2. 核心功能演示 简单搜索: ```bash # 搜索包含某个模式的文件 fd test # 指定搜索目录 fd passwd /etc ``` 正则表达式搜索: ```bash # 搜索以 x 开头、rc 结尾的文件 cd /etc fd '^x.*rc$' # 输出: # X11/xinit/xinitrc # X11/xinit/xserverrc ``` 列出所有文件: ```bash # 递归列出当前目录所有文件 fd # 列出指定目录的所有文件 fd . /path/to/dir ``` # 五、进阶内容 ## 1. 常用功能 按扩展名搜索: ```bash # 查找所有 Markdown 文件 fd -e md # 查找多个扩展名 fd -e rs -e cpp mod # 组合模式和扩展名 fd -e rs mod ``` 精确匹配文件名: ```bash # 使用 glob 模式精确匹配 fd -g libc.so /usr # 输出: # /usr/lib32/libc.so # /usr/lib/libc.so ``` 搜索隐藏文件: ```bash # 默认不搜索隐藏文件 fd pre-commit # 搜索隐藏文件 fd -H pre-commit # 输出: # .git/hooks/pre-commit.sample ``` 忽略 gitignore: ```bash # 默认遵循 .gitignore fd num_cpu # 不遵循 .gitignore fd -I num_cpu ``` 完全无限制搜索: ```bash # 搜索所有文件(包括隐藏和被忽略的) fd -u pattern # 等同于 fd -HI pattern ``` ## 2. 最佳实践 ### A. 搜索完整路径 默认只匹配文件名,使用 -p 选项匹配完整路径: ```bash fd -p -g '**/.git/config' fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)' ``` ### B. 限定搜索深度 ```bash # 只搜索当前目录(不递归) fd -d 1 pattern # 最多递归 3 层 fd -d 3 pattern ``` ### C. 按文件类型过滤 ```bash # 只搜索文件 fd -tf pattern # 只搜索目录 fd -td pattern # 只搜索符号链接 fd -tl pattern # 只搜索可执行文件 fd -tx pattern # 只搜索空文件 fd -te pattern ``` ### D. 按文件大小过滤 ```bash # 搜索大于 100MB 的文件 fd -S +100M # 搜索小于 1KB 的文件 fd -S -1k # 搜索大小在 1MB-1GB 之间的文件 fd -S +1M -S -1G ``` ### E. 按修改时间过滤 ```bash # 搜索最近 7 天修改的文件 fd --changed-within 7d # 搜索超过 30 天未修改的文件 fd --changed-before 30d # 搜索最近 1 小时修改的文件 fd --changed-within 1h ``` ## 3. 性能优化 fd 已经针对性能进行了优化。根据官方基准测试,在包含约 400 万文件的系统中: - fd 比 find -iregex 快约 23 倍 - fd 比 find -iname 快约 13 倍 性能优势主要来自: - 并行目录遍历 - 高效的正则表达式引擎 - 智能缓存策略 # 六、实战案例 ## 1. 场景描述 在日常开发和运维工作中,需要快速查找并批量处理文件。 ## 2. 实现步骤 ### 场景一:批量解压文件 ```bash # 查找所有 zip 文件并解压 fd -e zip -x unzip ``` ### 场景二:格式化代码 ```bash # 查找所有 .h 和 .cpp 文件并格式化 fd -e h -e cpp -x clang-format -i ``` ### 场景三:批量打开文件 ```bash # 在编辑器中打开所有测试文件 fd -g 'test_*.py' -X vim ``` ### 场景四:计算文件校验和 ```bash # 计算所有文件的 MD5 校验和 fd -tf -x md5sum > file_checksums.txt ``` ### 场景五:文件类型转换 ```bash # 将所有 jpg 文件转换为 png fd -e jpg -x convert {} {.}.png ``` ### 场景六:搜索并编辑 ```bash # 在所有 C++ 文件中搜索特定内容 fd -e cpp -e cxx -e h -e hpp -X rg 'std::cout' ``` ## 3. 完整代码示例 ### 占位符语法 fd 提供了类似 GNU Parallel 的占位符语法: ```bash # {} - 完整路径 fd -x echo {} # {.} - 去掉扩展名的路径 fd -x echo {.} # {/} - 文件名(含扩展名) fd -x echo {/} # {/.} - 文件名(不含扩展名) fd -x echo {/.} # {//} - 父目录 fd -x echo {//} ``` ### 并行控制 ```bash # 默认并行执行 fd -x command # 限制并发数为 4 fd -j 4 -x command # 串行执行 fd -j 1 -x command ``` ### 批量执行 ```bash # -x 为每个结果单独执行命令(并行) fd -e zip -x unzip # -X 一次性对所有结果执行命令 fd -g 'test_*.py' -X vim ``` # 七、常见问题 ## 1. 安装问题 ### Q: Ubuntu 上安装后命令是 fdfind 而不是 fd A: 创建软链接即可: ```bash ln -s $(which fdfind) ~/.local/bin/fd ``` ### Q: Windows 上找不到 fd 命令 A: 确保 Scoop/Chocolatey 安装目录已添加到 PATH 环境变量。 ## 2. 配置问题 ### Q: 如何永久设置排除模式 A: 创建 .fdignore 文件或全局配置文件: ```bash # 用户全局配置(Linux/macOS) ~/.config/fd/ignore # 用户全局配置(Windows) %APPDATA%\fd\ignore ``` 示例配置: ``` /mnt/external-drive *.bak *.tmp node_modules/ ``` ### Q: 如何显示文件详细信息 A: 使用 -l 选项: ```bash fd -l pattern ``` ## 3. 运行问题 ### Q: fd 找不到我的文件 A: 检查以下几点: 1. 文件是否在隐藏目录中,使用 -H 选项 2. 是否被 .gitignore 排除,使用 -I 选项 3. 是否需要匹配完整路径,使用 -p 选项 ### Q: 正则表达式不生效 A: 确保用单引号包裹正则表达式: ```bash fd '^[A-Z][0-9]+$' ``` ### Q: 如何删除匹配的文件 A: 使用 -X 选项配合 rm: ```bash # 删除所有 .DS_Store 文件 fd -H '^\.DS_Store$' -tf -X rm # 交互式删除(安全模式) fd -H '^\.DS_Store$' -tf -X rm -i ``` # 八、工具集成 ## 1. 与 fzf 集成 ```bash # 设置 fzf 使用 fd export FZF_DEFAULT_COMMAND='fd --type file' export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" # 带颜色的输出 export FZF_DEFAULT_COMMAND="fd --type file --color=always" export FZF_DEFAULT_OPTS="--ansi" ``` ## 2. 与 tree 集成 ```bash # 将 fd 输出格式化为树形结构 fd | tree --fromfile # 按扩展名过滤并显示为树 fd --extension rs | tree --fromfile ``` ## 3. 与 rofi 集成 ```bash # 在 rofi 中创建可搜索的 PDF 文件列表 fd --type f -e pdf . $HOME | rofi -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {} ``` ## 4. 与 xargs 集成 ```bash # 使用 NULL 分隔符处理特殊文件名 fd -0 -e rs | xargs -0 wc -l ``` # 九、命令选项速查 ## 常用选项 ```bash -H, --hidden # 搜索隐藏文件 -I, --no-ignore # 不遵循 .gitignore -s, --case-sensitive # 区分大小写 -i, --ignore-case # 不区分大小写 -g, --glob # glob 模式搜索 -a, --absolute-path # 显示绝对路径 -l, --list-details # 显示详细信息 -L, --follow # 跟随符号链接 -p, --full-path # 匹配完整路径 -d, --max-depth <n> # 限制搜索深度 -t, --type <type> # 按类型过滤 -e, --extension <ext> # 按扩展名过滤 -S, --size <size> # 按大小过滤 -x, --exec <cmd> # 对每个结果执行命令 -X, --exec-batch <cmd> # 批量执行命令 -j, --threads <n> # 并发线程数 -u, --unrestricted # 无限制搜索 ``` *** ## 参考资料 1. [fd - GitHub Repository](https://github.com/sharkdp/fd) 最后修改:2026 年 02 月 05 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏