Rust高效文件搜索工具fd-find的使用,fd-find比find更快更友好的终端文件搜索工具

Rust高效文件搜索工具fd-find的使用,fd-find比find更快更友好的终端文件搜索工具

fd是一个用于查找文件系统条目的程序,它是find的简单、快速且用户友好的替代品。虽然它不支持find的所有强大功能,但它为大多数用例提供了合理的默认设置。

功能特点

  • 直观的语法:fd PATTERN 而不是 find -iname '*PATTERN*'
  • 支持正则表达式(默认)和基于通配符的模式
  • 由于并行目录遍历,速度非常快
  • 使用颜色突出显示不同的文件类型(与ls相同)
  • 支持并行命令执行
  • 智能大小写:默认搜索不区分大小写,如果模式包含大写字符则切换为区分大小写
  • 默认忽略隐藏目录和文件
  • 默认忽略.gitignore中的模式
  • 命令名称比find短50% :)

演示

Demo

如何使用

简单搜索

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

1 回复

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       # 默认包含隐藏文件

性能优化提示

  1. 对于大型代码库,合理使用–max-depth参数可以显著提高搜索速度
  2. 默认情况下fd会忽略.gitignore中指定的文件,这通常会大幅减少搜索范围
  3. 使用-I参数时要谨慎,因为它会搜索所有文件,包括通常不需要的构建目录和依赖项

结论

fd-find通过其简洁的语法、智能的默认设置和优异的性能,为开发者提供了更高效的文件搜索体验。无论是日常文件查找还是脚本中的批量操作,fd都能显著提升工作效率。

回到顶部