Claude Code Tools 研究系列(四)—— Grep + Glob:搜索双人组

💡 原文中文,约9700字,阅读约需23分钟。
📝

内容提要

本文介绍Claude Code中Grep与Glob两个搜索工具。Glob按路径模式找文件,Grep按内容正则搜索,二者组合帮助AI在大型代码库中高效定位信息,避免盲目读取。Grep支持三种输出模式(内容、文件列表、计数),按需控制上下文消耗。工具设计强调按需感知、安全可控,并主动将复杂多轮搜索转交Agent处理。

🔎

延伸解读

按需感知:搜索工具如何节省上下文

Grep 和 Glob 的设计核心是“按需感知”,即只把 Claude 真正需要的信息送入上下文。Glob 按路径模式返回文件列表,Grep 按内容返回匹配行、文件列表或计数。通过控制输出模式,Claude 可以避免一次性读取大量无关内容,从而在大型代码库中高效定位,同时节省宝贵的上下文窗口。

Grep 的三档输出模式:精度与成本的平衡

Grep 提供三种输出模式:content(匹配行)、files_with_matches(文件列表)和 count(计数)。默认模式是 files_with_matches,因为 content 最耗上下文。这种设计让 Claude 可以根据任务需求选择合适的信息粒度:需要修复时用 content,重构时用文件列表,评估规模时用计数,从而在信息获取与上下文消耗之间取得平衡。

为何不用 Bash 直接调 rg?

文章强调,Claude Code 专门提供 Grep 工具,而不是让 Claude 通过 Bash 调用 rg。原因包括:避免 shell 转义问题、路径依赖、输出解析困难,以及缺少结构化的输出模式。专用工具参数类型化、输出规范化,且无 shell 陷阱,因此更安全、更高效。这也是工具描述中“ALWAYS use Grep”的原因。

工具边界:何时该交给 Agent

Grep 和 Glob 的描述中都明确提到,对于需要多轮搜索的开放式任务,应使用 Agent 工具。这表明工具设计者清楚自身的局限性,并主动将复杂场景转交给更强大的 Agent。这种“承认边界”的设计体现了 Claude Code 工具生态的克制与成熟,避免在单次工具调用中死磕。

Q&A

Claude Code 中 Glob 和 Grep 分别有什么作用?

Glob 按路径模式(如 **/*.ts)查找文件,返回匹配的文件路径列表,按修改时间倒序排列;Grep 按内容(正则表达式)搜索,返回匹配的文件、行或计数。二者组合使用,帮助 AI 在大型代码库中快速定位需要查看的文件。

Grep 的 output_mode 有哪几种?分别适用于什么场景?

Grep 有三种输出模式:content(返回匹配行及上下文,适合需要具体位置和细节时)、files_with_matches(仅返回文件路径列表,适合只需知道涉及哪些文件时)、count(返回匹配文件数量,适合评估规模时)。默认是 files_with_matches,以节省上下文。

为什么 Claude Code 不直接用 Bash 执行 grep 或 rg,而是提供专门的 Grep 工具?

因为直接使用 Bash 调用 grep/rg 存在 shell 转义问题、路径依赖、输出解析困难等痛点,且没有 output_mode 分档,容易浪费上下文。专用 Grep 工具参数类型化、输出规范化、无 shell 陷阱,更安全高效。

在什么情况下应该使用 Glob,什么情况下应该使用 Grep?

当需要按文件名或路径模式查找文件(如所有 .tsx 文件、最近修改的文件)时使用 Glob;当需要按内容搜索(如哪里使用了某个函数、搜索错误信息)时使用 Grep。两者常组合使用:先用 Glob 缩小范围,再用 Grep 深入搜索。

Grep 和 Glob 在什么情况下应该转交给 Agent 处理?

当进行开放式搜索,可能需要多轮 glob 和 grep 交替进行时(例如查找哪个模块最近被改坏),工具描述会主动建议使用 Agent 工具,而不是在单次调用中硬扛。

Grep 的 type 参数和 glob 参数有什么区别?

type 参数基于 ripgrep 内置的语言识别,如 type: "ts" 可搜索 TypeScript 文件;glob 参数是纯路径模式匹配,如 "**/*.ts"。type 更简洁,glob 更灵活,可处理特殊路径(如排除目录)。

Grep 的默认输出模式为什么是 files_with_matches 而不是 content?

因为 content 模式会返回匹配行及上下文,最消耗上下文。默认使用 files_with_matches 只返回文件路径列表,让 Claude 先了解涉及哪些文件,再决定是否需要深入查看,从而节省 token 预算。

Glob 返回的文件列表为什么按修改时间倒序排列?

按修改时间倒序排列可以让 Claude 优先看到最近修改的文件,这些通常是当前的主战场,有助于快速定位活跃代码,类似人类使用 ls -lt 查看最近改动。

🏷️

标签

➡️

继续阅读