首页/系统/Linux 运维命令速查/grep 递归搜索目录
文本处理77 条

grep 递归搜索目录

在目录树中递归搜索:-r 递归、-l 只列文件名、--include/--exclude-dir 过滤范围,代码与配置排查利器。

Linux 运维命令速查系统更新于 2026-10-13

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 只拿文件清单,再决定逐个查看还是整体替换。把「找」和「改」分成两步,是批量修改不出事的关键。

易错点

  • 大目录不加 --exclude-dir 会扫进版本库与依赖目录,慢且噪音大
  • -r 与 -R 对符号链接的处理不同,用错会在有链接的目录里漏搜或重复搜
  • 圈定文件清单时用 -l 而不是靠 cut 去拼文件名,含空格的名字会被拼错
  • 搜到二进制文件时提示 binary file matches,需要看内容就先 file 判断类型
  • 正则里的点号、括号等特殊字符不转义会扩大匹配范围,得到大量无关结果

数据来源与参考

  • man 1 grep(GNU grep 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌