分工先定清楚,别拿错工具

Everything 读 NTFS 的 USN Journal,按文件名检索,百万级文件也是毫秒级出结果;它并不索引内容,1.5 版之后虽有 content: 语法,但那是全盘实时扫描,慢到不该这么用。ripgrep 按内容递归搜索,默认遵守 .gitignore、跳过隐藏文件和二进制。正确组合是:Everything 先定位"那个文件在哪",rg 再在文件里找"具体哪一行"。反过来用,一个慢一个找不到,是新手最常见的错配。

Everything 的查询语法

ext:php;log                  按扩展名
dm:2026-01                   按修改月份
size:>10mb                   大于 10 MB
*.tmp | *.bak                并集
regex:^report_d{4}.csv$    正则模式
path:D:wwwroot ext:php      限定目录

把常用条件在工具栏里存成"过滤器"(Filter),比每次手敲快得多。Everything 还能开 HTTP 服务器(Options → HTTP Server),局域网里用浏览器查文件名,或挂 ETP/FTP 给远程用。它只在 NTFS 上快,FAT32 或网络盘没有 USN Journal,会退化成普通扫描。

ripgrep 安装与常用命令

winget install --id BurntSushi.ripgrep.MSVC -e
scoop install ripgrep
choco install ripgrep

rg "num_ctx" -n -g "*.php" .
rg -i --hidden -g "!node_modules" "todo" .
rg -l "TODO" .
rg -F "a[0]" .                 # -F 按字面量,不当正则
rg -A 3 -B 3 "Exception" src/
rg --stats "function handle" .
rg -uu "secret" .              # -uu 连隐藏和 ignore 一起搜

把默认参数写进 .ripgreprc,再用 RIPGREP_CONFIG_PATH 指过去,就不用每次带一长串 flag。注意配置文件里一行一个参数,注释用 # 开头。

--hidden
--smart-case
--glob=!.git/
--glob=!node_modules/
--glob=!dist/
--max-columns=200
--max-columns-preview
setx RIPGREP_CONFIG_PATH C:Usersme.ripgreprc
rg --files | rg "config"      # 先列文件再过滤,配合 fd 更顺手

组合、集成与踩坑

找文件名用 fd(fd "report" -e csv),找内容用 rg,两者组合比 Everything 更跨平台。VS Code 的全局搜索底层就是 rg,可以在设置里确认 "search.useRipgrep": true,专业场景还能指定自定义的 rg 路径和额外的 search.exclude 规则。

  • 查不到隐藏目录:默认忽略规则生效,加 -uu 或临时去掉 .ripgreprc 里的 --glob。
  • GBK 中文搜不到:老项目源码不是 UTF-8,要么批量转码,要么给 rg 加 --encoding gbk,别以为是工具坏了。
  • 正则里路径:Windows 反斜杠在正则中是一个转义符,写成两个或用正斜杠;-g 里的排除模式用 ! 前缀。
  • 二进制文件:默认跳过,非要搜加 --text,但输出基本不可读,正确的做法是先确认文件类型。