grep -r 是什么
在目录树里搜文本,grep -r 是最直接的入口。它的价值在于范围控制:-l 只列文件名、-n 带行号、--include 与 --exclude-dir 把搜索限制在需要的文件类型与目录上。批量替换前的第一步通常就是它——先用 grep -rl 圈定要改的文件清单,再交给 sed 或 xargs,避免手写文件列表。
基本信息
| 适用平台 | Linux、Unix 通用;--include 与 --exclude-dir 是 GNU grep 的选项 |
|---|---|
| 命令语法 | grep -r [选项] 模式 目录 |
| 常用选项 | -r 递归 / -R 递归并跟随符号链接 / -l 只列文件名 / -n 带行号 / -i 忽略大小写 / -w 全词匹配 / -E 扩展正则 / --include / --exclude-dir / -I 跳过二进制 |
| 性能提示 | 大目录先排除版本库与依赖目录 |
典型使用场景
- 站点换域名前,搜出所有引用旧域名的文件清单
- 排查硬编码配置,搜 api_key、password 之类的键名
- 代码审查中定位 TODO、FIXME 与遗留注释
- 替换完成后复跑同样的搜索,确认没有遗漏
- 在大仓库里用更快的替代工具,但结果口径要与 grep 对齐
常用示例
常用示例
grep -rn 'api_key' /etc/myapp # 带行号递归查找
grep -rl 'old-domain.com' /var/www # 只列出命中的文件
grep -rn 'TODO' src/ --include='*.py' # 限定文件类型
grep -r --exclude-dir={.git,node_modules} 'password' .
grep -rnw 'timeout' conf/ # 全词匹配,避免命中 timeout_ms
grep -rli 'redis' /etc/ | head # 忽略大小写,只列文件范围控制选项
| 选项 | 作用 | 提示 |
|---|---|---|
| -r | 递归搜索,不跟随符号链接 | 默认更安全的选择 |
| -R | 递归并跟随符号链接 | 存在循环链接时会绕圈重复输出 |
| -l | 只输出文件名 | 适合喂给后续命令 |
| -n | 输出行号 | 定位与编辑都要用 |
| --include | 只搜索匹配的文件 | 可以重复使用多个模式 |
| --exclude-dir | 跳过指定目录 | 大仓库必加 |
| -I | 跳过二进制文件 | 等价于 --binary-files=without-match |
-r 不跟随符号链接,-R 会跟随。仓库里若存在指向父目录的链接,-R 可能陷入循环并重复输出同一批文件,日常优先用 -r。
结果太多时先加 -l 只拿文件清单,再决定逐个查看还是整体替换。把「找」和「改」分成两步,是批量修改不出事的关键。