
作为一个和服务器、代码打交道的打工人,如果你问我终端里敲得最多的命令是什么,那绝对少不了这两个:find 和 grep。
找文件、搜日志、查代码……它们是我们穿梭在 Linux 文件系统里的“左膀右臂”。但是,随着项目越来越大(想想那深不见底的 node_modules 文件夹和庞大的微服务源码),传统的 find 和 grep 常常会让我们在屏幕前陷入漫长的等待……
后来我把它们换成了由 Rust 语言重写的新一代终端神器 —— fd 和 rg (ripgrep)。结果不仅速度提升了十几倍,而且语法更简单、默认高亮,简直是用了就再也回不去的效率外挂!
今天,就带大家全面对比一下这组“新老交替”的搜索神器,看看它们到底强在哪,以及如何快速安装到你的电脑上。
找文件:find vs fd
find 是一个极其强大的工具,但它的痛点也很明显:语法太反人类了! 每次想按后缀找个文件,都得敲一长串参数。而 fd 就是为了解决这些痛点而生的。
如何安装 fd
GitHub项目地址:https://github.com/sharkdp/fd
支持全平台。macOS 可以直接 brew install fd,Windows 可以通过 直接去github上下载安装包安装。Linux 主流发行版安装命令如下:
# Debian/Ubuntu系统
# 注意:Ubuntu下安装后的命令名是fdfind,防止和别的软件冲突
sudo apt install fd-find
# CentOS/RHEL系统
sudo dnf install fd-find
# Arch Linux系统
sudo pacman -S fd
痛点对比 1:繁琐的语法 vs 极简主义
假设我们要在当前目录下查找所有的 .py 文件。
老派的 find:
find . -type f -name "*.py"
新一代的 fd:
fd -e py
是的,你没看错,fd -e (extension) 加上后缀名就搞定了,甚至连星号 * 都不用敲!
痛点对比 2:无脑遍历 vs 智能忽略
当你用 find 搜索时,它会傻乎乎地去遍历 .git 隐藏目录,或者前端庞大的 node_modules 目录,这不仅拖慢了速度,还会搜出一堆毫无意义的垃圾结果。
而 fd 是为开发者设计的,它默认具备以下特性:
- 自动忽略隐藏文件和目录(比如
.git)。 - 自动读取
.gitignore文件,你不需要的文件它连看都不看。 - 智能大小写:如果你输入全小写,它会忽略大小写匹配;如果你输入了哪怕一个大写字母,它就会自动切换为精确大小写匹配!
速度对比
得益于 Rust 优秀的内存管理和多线程并发遍历机制,fd 的搜索速度常常是 find 的数倍甚至十几倍。在一个包含十几万个文件的项目中搜索,find 可能需要数秒,而 fd 几乎是按下回车的瞬间就出结果了。
其他常用场景
1️⃣ 查找文件名(最常用)
find 写法:
find . -name "*.java"
fdfind 写法:
fdfind .java
或者更精准:
fdfind -e java
-e = 按扩展名搜索
2️⃣ 指定目录搜索
fdfind log /var/log
等价于:
find /var/log -name "*log*"
3️⃣ 只查文件 / 只查目录
fdfind -t f # 只文件
fdfind -t d # 只目录
fdfind -t l # 只符号链接
等价 find:
find . -type f
4️⃣ 忽略 .gitignore(非常适合代码仓库)
默认行为:
fdfind config
会自动忽略:
.gitignore
node_modules
target
build
如果你想强制查全部:
fdfind -H config
-H包含隐藏文件-I忽略 ignore 规则
5️⃣ 正则匹配
fdfind '^test_.*\.py$'
默认支持正则表达式(不用 -regex)
find 写法会非常复杂:
find . -regex ".*test_.*\.py"
6️⃣ 按文件大小查找
fdfind -S +10M
+10M大于10MB-10k小于10KB
等价 find:
find . -size +10M
7️⃣ 按时间查找
fdfind --changed-within 7d
查找 7 天内修改的文件。
find 等价:
find . -mtime -7
8️⃣ 执行命令(替代 -exec)
find 写法:
find . -name "*.log" -exec rm {} \;
fdfind 写法:
fdfind -e log -x rm
或者:
fdfind -e log -X rm
区别:
-x一个一个执行-X批量执行(更快)
9️⃣ 和 xargs 配合(推荐用法)
fdfind -e java | xargs wc -l
统计 Java 文件总行数。
🔟 查空目录
fdfind -t d -E .git -x test -z {}
(实际使用中可结合脚本)
1️⃣1️⃣ 查询隐藏文件处理
默认不查隐藏文件。
查隐藏文件:
fdfind -H config
忽略 ignore 规则:
fdfind -I config
同时打开:
fdfind -HI config
进阶技巧
1️⃣ 只搜索当前目录(不递归)
fdfind -d 1
2️⃣ 排除目录
fdfind log -E target -E node_modules
3️⃣ 配合 grep 使用(比 find + grep 清爽)
fdfind -e java -x grep "TODO"
更推荐:
fdfind -e java | xargs grep "TODO"
(如果追求极致性能可以直接用 ripgrep)
搜内容:grep vs rg (ripgrep)
如果说 fd 是找文件的好手,那 rg 就是搜文本内容的“极速杀手”。在各大终端工具的性能基准测试中,ripgrep 几乎常年霸榜,甚至把以速度著称的 ag (The Silver Searcher) 都按在地上摩擦。
GitHub项目地址:https://github.com/BurntSushi/ripgrep
场景对比:在庞大项目中搜某个函数
假设我们需要在当前项目的源码中查找关键字 TODO:。
传统的 grep 命令:
grep -rn "TODO:" .
(结果:等了半天,发现满屏都是 node_modules 里的第三方库的 TODO,真正自己写的代码完全被淹没了……)
新一代的 rg:
# 直接跟关键字,默认就会递归搜索当前目录 ,如果没有特殊符号或空格 搜索时也可以不用双引号,如: rg TODO:
rg "TODO:"
rg 的优势简直直击灵魂:
- 默认递归搜索当前目录,不需要加
-r或.。 - 默认忽略
.gitignore中的文件,直接跳过构建产物和第三方依赖! - 自带完美的语法高亮,文件名、行号、匹配项用不同颜色区分,看结果时眼睛再也不累了。
- 快到离谱:
rg使用了极其优化的正则表达式引擎和内存映射技术(Memory Map),在 GB 级文本或巨型代码库中搜索时,速度常常比grep快几十倍!
其他常用场景
1️⃣ 指定目录搜索
rg "password" /etc
2️⃣ 限制文件类型
rg TODO -t java
支持大量内置类型:
rg TODO -t py
rg TODO -t js
rg TODO -t go
等价 grep:
grep -r --include="*.java" TODO .
3️⃣ 按扩展名搜索
rg TODO -g "*.java"
排除某类文件:
rg TODO -g "!*.log"
4️⃣ 忽略 .gitignore(强制全量搜索)
默认会忽略:
.gitignore
node_modules
target
强制搜索全部:
rg -uu TODO
参数说明:
-u关闭 ignore-uu包含隐藏文件-uuu搜索二进制文件
5️⃣ 显示行号
默认就带行号:
rg TODO
效果类似:
UserService.java:45: // TODO 优化逻辑
6️⃣ 只显示文件名
rg -l TODO
等价 grep:
grep -rl TODO .
7️⃣ 统计匹配次数
rg -c TODO
只统计总数:
rg -c TODO | awk -F: '{sum+=$2} END{print sum}'
8️⃣ 精确匹配单词
rg -w user
避免匹配到:
username
userId
9️⃣ 忽略大小写
rg -i error
🔟 使用正则表达式
rg "user.*service"
支持高级正则(默认)
多行匹配:
rg -U "start.*end"
1️⃣1️⃣ 搜索并替换(高级用法)
虽然 rg 本身不直接修改文件,但可配合 sed:
rg -l oldText | xargs sed -i 's/oldText/newText/g'
1️⃣2️⃣ 结合 fdfind 使用(开发神器组合)
配合 fd:
fdfind -e java | rg TODO
比:
find + grep
简洁很多。
如何安装rg
心动了吗?下面教你如何在各大主流操作系统上安装它们!
避坑提示: 在 Ubuntu/Debian 系统中,由于
fd这个名字已经被另一个软件占用了,所以通过包管理器安装的fd命令叫fdfind。我们可以自己加个别名(alias)把它改回来。
macOS 用户 (推荐使用 Homebrew)
打开终端,直接输入:
brew install fd ripgrep
Ubuntu / Debian 用户
使用 apt 安装:
# 安装 fd (注意包名是 fd-find)
sudo apt update
sudo apt install fd-find
# 给 fdfind 创建一个 fd 的软链接(或者写进 ~/.bashrc 或 ~/.zshrc 的 alias 里)
ln -s $(which fdfind) ~/.local/bin/fd
# 安装 ripgrep
sudo apt install ripgrep
CentOS / RHEL 用户
# 安装 fd
sudo yum install epel-release
sudo yum install fd-find
# 安装 ripgrep
sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
sudo yum install ripgrep
(注:由于某些老版本 CentOS 库比较旧,如果源里找不到,推荐使用下面提到的 Cargo 方式安装)
Windows 用户
如果你是开发者,强烈推荐使用 Scoop 或 Winget 包管理器:
# 使用 Scoop
scoop install fd ripgrep
# 使用 Winget
winget install sharkdp.fd
winget install BurntSushi.ripgrep.MSVC
如果安装不成功,可以直接去 github 上下载安装包
终极安装法(全平台通用)
既然它们是用 Rust 写的,只要你的电脑上安装了 Rust 环境,直接用 Cargo 安装是获取最新版本最爽的方式:
cargo install fd-find ripgrep
写在最后
技术一直在发展,传统的 Unix 哲学固然经典,但基于现代化需求和现代编程语言(如 Rust)重构的命令行工具,正在以不可逆转的趋势改善着我们的开发体验。
除了 fd 和 rg,现在还有很多非常棒的 Rust 替代品,比如替代 ls 的 eza,替代 cd 的 zoxide,替代 cat 的 bat…… 如果大家感兴趣,我们下期再来盘点!
你平时最常用的搜索命令行是什么?有没有什么独门的小技巧? 欢迎在评论区留言分享你的“绝招”!
如果觉得这篇文章对你有帮助,别忘了点赞、推荐、分享给你的程序员小伙伴哦!你的支持是我持续输出干货的最大动力!
Q.E.D.


