作为一个和服务器、代码打交道的打工人,如果你问我终端里敲得最多的命令是什么,那绝对少不了这两个:findgrep

找文件、搜日志、查代码……它们是我们穿梭在 Linux 文件系统里的“左膀右臂”。但是,随着项目越来越大(想想那深不见底的 node_modules 文件夹和庞大的微服务源码),传统的 findgrep 常常会让我们在屏幕前陷入漫长的等待……

后来我把它们换成了由 Rust 语言重写的新一代终端神器 —— fdrg (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 是为开发者设计的,它默认具备以下特性:

  1. 自动忽略隐藏文件和目录(比如 .git)。
  2. 自动读取 .gitignore 文件,你不需要的文件它连看都不看。
  3. 智能大小写:如果你输入全小写,它会忽略大小写匹配;如果你输入了哪怕一个大写字母,它就会自动切换为精确大小写匹配!

速度对比

得益于 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 的优势简直直击灵魂:

  1. 默认递归搜索当前目录,不需要加 -r.
  2. 默认忽略 .gitignore 中的文件,直接跳过构建产物和第三方依赖!
  3. 自带完美的语法高亮,文件名、行号、匹配项用不同颜色区分,看结果时眼睛再也不累了。
  4. 快到离谱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)重构的命令行工具,正在以不可逆转的趋势改善着我们的开发体验。

除了 fdrg,现在还有很多非常棒的 Rust 替代品,比如替代 lseza,替代 cdzoxide,替代 catbat…… 如果大家感兴趣,我们下期再来盘点!

你平时最常用的搜索命令行是什么?有没有什么独门的小技巧? 欢迎在评论区留言分享你的“绝招”!


如果觉得这篇文章对你有帮助,别忘了点赞、推荐、分享给你的程序员小伙伴哦!你的支持是我持续输出干货的最大动力!

Q.E.D.


寻门而入,破门而出