用grep -r搜索文件内容最常用可靠,加-l只列文件名,配合--include或find可限定类型;rg、ag、ack是大项目更快替代。

直接用 grep -r 就行,这是最常用、最可靠的方式。关键不是“能不能搜”,而是“怎么避免白忙活”——比如搜出一堆乱码、卡在二进制文件里,或者误把文件名当内容搜。
按内容搜文件:用 grep -r(别漏 -l)
grep 默认输出的是匹配的**行内容**,不是文件路径。想快速知道“哪些文件含关键字”,必须加 -l(小写 L):
-
grep -rl "get_config_of_tunnel" ./src→ 只列出含该关键字的文件名 -
grep -rni "error" /var/log→ 递归、忽略大小写、显示行号 -
grep -r --binary-files=without-match "TODO" .→ 跳过 .png/.so 等二进制文件,不报错不卡住
限定文件类型再搜:更干净、更高效
如果只关心源码或配置文件,硬扫全部文件既慢又干扰多。两种主流做法:
-
grep 自带过滤:
grep -rl --include="*.py" "import requests" ./src -
find + grep 组合:
find ./src -name "*.go" -exec grep -l "func main" {} \;(适合复杂条件,比如还要排除 test 文件)
按文件名搜 vs 按内容搜:别混用
这是最容易踩的坑:
-
find -name "*nginx*"→ 找文件名里带 nginx 的文件或目录(不管里面写了啥) -
grep -rl "nginx" /etc→ 找内容里含 nginx 的所有文件(哪怕叫 a.conf) -
locate nginx→ 查数据库里“文件名含 nginx”的条目(快但可能不包含刚新建的文件)
大项目建议换更快工具
如果代码库超过几万行,原生 grep 会变慢。推荐三个现代替代:
-
rg(ripgrep):默认跳过 .git/二进制/忽略文件,速度最快,
rg "TODO"直接开搜 -
ag(The Silver Searcher):老牌程序员友好工具,
ag -l "error" -
ack:轻量简洁,
ack --python "def test"可按语言过滤











