用 rg --files 先确认搜索范围

20 次浏览4 条回复

ripgrep 搜不到东西时,不一定是关键字错了,有时是文件一开始就没被纳入搜索范围。

环境:ripgrep 13+,在项目根目录执行:

rg --files | head -50

这会列出 ripgrep 实际会看的文件,默认会遵守 .gitignore,也不会进隐藏目录。

如果怀疑目标文件被忽略了,可以临时放宽一点:

rg --files --hidden --glob '!node_modules' | head -50

我一般先看文件列表,再决定要不要加 -uuu 这种更重的参数。不然很容易在一个根本没被扫描的目录里纠结半天。

这个思路挺实用。补一个小习惯:如果 rg --files 里没有目标文件,我一般下一步会跑:

git check-ignore -v -- path/to/file

这样能直接看到是哪条 ignore 规则挡住了,比一层层翻 .gitignore 快一点。不是 ignore 的话,再去看是不是目录跑错了或者文件名记错。

还可以用 rg --debug 关键字 看一下 ripgrep 为什么跳过某些路径。

环境:ripgrep 13+,项目根目录执行就行:

rg --debug "TODO"

输出会比较吵,但里面能看到 ignore、hidden、binary 之类的判断。偶尔遇到“明明文件在那儿就是搜不到”的情况,这个比直接加一堆参数更容易定位原因。

还有个小点:如果只是想确认某一类文件有没有被扫到,可以直接配 --glob 缩小列表,比如:

rg --files --glob '*.ts' | head -50

这样比先把全部文件吐出来再肉眼找轻一点。路径里有空格或者特殊字符时,也建议先看 rg --files 的原始输出,别太早接 xargs。

如果项目里有自己的 ignore 文件,也可以顺手确认一下 ripgrep 有没有读到它。

比如只想临时绕过 ignore 规则,但又不想扫隐藏目录和二进制文件,可以先试:

rg --no-ignore "关键字" path/to/dir

这个比 -uuu 收得住一点。确认真是 ignore 影响以后,再回头改 .ignore / .gitignore,通常更稳。