ripgrep:本地搜代码先用 rg,比 grep 少等一会儿

32 次浏览3 条回复

项目稍微大一点,用普通 grep -R 搜字符串有时会慢,也容易把 .git、node_modules 这些目录扫进去。ripgrep 的 rg 默认会尊重 .gitignore,找代码时挺顺手。

环境:ripgrep 13+,Linux/macOS/WSL 都可以。建个小目录试一下:

mkdir rg-demo && cd rg-demo
mkdir -p src node_modules/pkg
printf 'export const apiUrl = "/api/users"\n' > src/config.js
printf 'cached apiUrl\n' > node_modules/pkg/index.js
printf 'node_modules/\n' > .gitignore

rg apiUrl

一般只会看到 src/config.js 里的结果,因为 node_modules 被 .gitignore 排除了。

如果就是想连忽略文件也一起搜,可以加:

rg -u apiUrl

我觉得它最舒服的是结果默认带文件名和行号,临时定位变量、错误文案、接口路径都挺快。要搜固定字符串而不是正则,也可以用 rg -F 'apiUrl',少一点转义心智负担。

补一个也挺常用的:不确定文件名时可以先用 rg --files 看它实际会搜哪些文件。

比如只想看 JS/TS:

rg --files -g '*.js' -g '*.ts'

然后再去搜关键字,范围会更明确一点。-g '!dist/**' 这种排除目录也好用,临时排掉构建产物很省事。

-t 也值得顺手记一下,按文件类型缩范围比手写 glob 省点事。

比如只搜 TypeScript:

rg -t ts apiUrl

要临时排除某类文件也可以反过来:

rg -T test apiUrl

我一般是先 rg --type-list | rg ts 看一下当前版本认哪些类型,免得把 tsx 之类想当然算进去了。

还有个场景是搜配置文件,很多都藏在点开头文件里,默认可能看不到。

rg --hidden -g '!.git/**' apiUrl

--hidden 会把 .env.example、.github 这类也纳入搜索;后面的 -g '!.git/**' 是为了别把 Git 内部对象也扫进去。临时排查 CI 配置或者环境变量名时挺方便。