Rust高效文件搜索工具fd-find的使用,fd-find比find更快更友好的终端文件搜索工具
Rust高效文件搜索工具fd-find的使用,fd-find比find更快更友好的终端文件搜索工具
fd是一个用于查找文件系统条目的程序,它是find的简单、快速且用户友好的替代品。虽然它不支持find的所有强大功能,但它为大多数用例提供了合理的默认设置。
功能特点
- 直观的语法:
fd PATTERN
而不是find -iname '*PATTERN*'
- 支持正则表达式(默认)和基于通配符的模式
- 由于并行目录遍历,速度非常快
- 使用颜色突出显示不同的文件类型(与ls相同)
- 支持并行命令执行
- 智能大小写:默认搜索不区分大小写,如果模式包含大写字符则切换为区分大小写
- 默认忽略隐藏目录和文件
- 默认忽略.gitignore中的模式
- 命令名称比find短50% :)
演示
如何使用
简单搜索
fd设计用于查找文件系统中的条目。最基本的搜索方式是运行fd并传入一个参数:搜索模式。
# 查找包含"netfl"的文件
> fd netfl
Software/python/imdb-ratings/netflix-details.py
正则表达式搜索
搜索模式被视为正则表达式。以下示例查找以x
开头并以rc
结尾的文件:
> cd /etc
> fd '^x.*rc$'
X11/xinit/xinitrc
X11/xinit/xserverrc
指定根目录
如果要搜索特定目录,可以将其作为第二个参数传递给fd:
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
递归列出所有文件
可以不带参数调用fd,这用于快速递归查看当前目录中的所有条目:
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
搜索特定文件扩展名
使用-e
(或--extension
)选项可以搜索特定类型的文件:
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
搜索特定文件名
使用-g
(或--glob
)选项查找与提供的搜索模式完全匹配的文件:
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
隐藏和忽略的文件
使用-H
(或--hidden
)选项可以搜索隐藏文件:
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
使用-I
(或--no-ignore
)选项可以忽略.gitignore模式:
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
命令执行
fd提供了两种执行外部命令的方式:
-x
/--exec
:为每个搜索结果运行外部命令(并行)-X
/--exec-batch
:运行一次外部命令,将所有搜索结果作为参数
示例
递归查找所有zip存档并解压:
fd -e zip -x unzip
查找所有.h
和.cpp
文件并用clang-format -i
格式化:
fd -e h -e cpp -x clang-format -i
查找所有test_*.py
文件并在vim中打开:
fd -g 'test_*.py' -X vim
将jpg文件转换为png:
fd -e jpg -x convert {} {.}.png
完整示例代码
# 基本搜索示例
fd ".*\.rs$" # 查找所有.rs文件
# 忽略.gitignore中的文件
fd -I "config" # 查找所有包含"config"的文件,包括.gitignore中的
# 搜索特定目录
fd ".*\.txt$" ~/Documents # 在Documents目录中查找所有.txt文件
# 使用通配符搜索
fd -g "*.md" # 查找所有.md文件
# 并行执行命令
fd -e log -x gzip # 查找所有.log文件并用gzip压缩
# 批量执行命令
fd -e jpg -X montage -geometry +0+0 -tile 5x5 collage.jpg # 将jpg文件合并为拼贴画
# 显示文件详细信息
fd -l ".*\.rs$" # 查找.rs文件并显示详细信息(类似ls -l)
# 搜索特定大小的文件
fd -S +1M # 查找大于1MB的文件
fd -S -100k # 查找小于100KB的文件
# 搜索特定类型的文件
fd -tf # 只查找普通文件
fd -td # 只查找目录
fd -tx # 只查找可执行文件
# 搜索最近修改的文件
fd --changed-within "1 day" # 查找一天内修改过的文件
fd --changed-before "2023-01-01" # 查找2023年1月1日前修改的文件
性能对比
fd比传统的find命令快得多。在一个包含约750,000个子目录和400万文件的测试中:
# find使用正则表达式搜索
Benchmark 1: find ~ -iregex '.*[0-9]\.jpg$'
Time (mean ± σ): 19.922 s ± 0.109 s
# find使用通配符搜索
Benchmark 2: find ~ -iname '*[0-9].jpg'
Time (mean ± σ): 11.226 s ± 0.104 s
# fd搜索
Benchmark 3: fd -u '[0-9]\.jpg$' ~
Time (mean ± σ): 854.8 ms ± 10.0 ms
在这个例子中,fd比find -iregex快约23倍,比find -iname快约13倍。
安装
在Ubuntu/Debian上
sudo apt install fd-find
ln -s $(which fdfind) ~/.local/bin/fd
使用cargo安装
cargo install fd-find
在macOS上
brew install fd
在Windows上
可以从release page下载预编译的二进制文件,或使用scoop/chocolatey安装:
scoop install fd
# 或
choco install fd
Rust高效文件搜索工具fd-find使用指南
简介
fd-find(简称fd
)是一个用Rust编写的文件搜索工具,旨在替代传统的Unix find
命令。它提供了更快的搜索速度、更直观的语法和更友好的默认设置。
主要特点
- 比传统
find
命令更快 - 彩色输出
- 智能大小写处理
- 默认忽略隐藏文件和.gitignore中的文件
- 正则表达式支持
- 并行执行
安装方法
Linux/macOS (Homebrew)
brew install fd
Ubuntu/Debian
sudo apt install fd-find
通过Cargo安装
cargo install fd-find
基本使用方法
简单搜索
fd pattern
这会递归搜索当前目录下文件名包含"pattern"的文件
指定搜索目录
fd pattern /path/to/dir
搜索特定扩展名
fd -e rs
# -e 参数指定扩展名,这里是搜索所有Rust源文件(.rs)
忽略大小写
fd -i pattern
# -i 参数启用忽略大小写搜索
精确匹配
fd -g '*.rs'
# -g 参数使用glob模式精确匹配
包含隐藏文件
fd -H pattern
# -H 参数包含隐藏文件和目录
包含.gitignore中的文件
fd -I pattern
# -I 参数不遵守.gitignore规则
高级用法
使用正则表达式
fd '^[a-z]+\.rs$'
# 使用正则表达式匹配以小写字母开头且以.rs结尾的文件
执行命令
fd -e rs -x rustc {}
# -x 参数对每个找到的.rs文件执行rustc命令
# {} 会被替换为文件名
限制搜索深度
fd --max-depth 2 pattern
# --max-depth 限制搜索深度为2层目录
排除目录
fd pattern --exclude node_modules
# --exclude 排除指定目录
查找空目录
fd --type d --maxdepth 1 --min-depth 1 --size -1c
# --type d 只搜索目录
# --size -1c 查找大小为0的目录
与find命令对比示例
传统find命令:
find . -name "*.rs" -type f -not -path "./target/*"
# 查找当前目录下所有.rs文件,但不包括target目录下的
等效的fd命令:
fd -e rs --exclude target
# 更简洁的语法实现相同功能
完整使用示例
# 1. 安装fd
brew install fd # macOS
# 或
sudo apt install fd-find # Ubuntu/Debian
# 2. 基本搜索示例
# 在当前目录及子目录中搜索所有包含"main"的文件
fd main
# 3. 搜索特定类型的文件
# 查找所有的Markdown文件
fd -e md
# 4. 高级搜索示例
# 查找src目录下所有以test开头且以.rs结尾的文件,最大深度为3
fd '^test.*\.rs$' src --max-depth 3
# 5. 执行批量操作
# 对所有找到的.rs文件运行rustfmt格式化
fd -e rs -x rustfmt {}
# 6. 排除某些目录
# 搜索所有.py文件,但排除venv和__pycache__目录
fd -e py --exclude venv --exclude __pycache__
# 7. 配置文件默认行为
# 在.bashrc或.zshrc中添加:
export FD_IGNORE_CASE=true # 默认忽略大小写
export FD_HIDDEN=true # 默认包含隐藏文件
性能优化提示
- 对于大型代码库,合理使用–max-depth参数可以显著提高搜索速度
- 默认情况下fd会忽略.gitignore中指定的文件,这通常会大幅减少搜索范围
- 使用-I参数时要谨慎,因为它会搜索所有文件,包括通常不需要的构建目录和依赖项
结论
fd-find通过其简洁的语法、智能的默认设置和优异的性能,为开发者提供了更高效的文件搜索体验。无论是日常文件查找还是脚本中的批量操作,fd都能显著提升工作效率。