Search
Find files by name pattern and search file contents with regular expressions.
Claude Code has two dedicated search tools: Glob for finding files by name and Grep for searching file contents. Both are preferred over running find or grep as Bash commands — they have correct permission integration, return results sorted by modification time, and produce structured output Claude can act on directly.
Glob
Finds files whose paths match a glob pattern. Results are sorted by modification time (most recently modified first).
Parameters
-
pattern(string) — A glob pattern to match file paths against. Supports*(any characters within a path segment),**(any number of path segments), and?(single character). -
path(string) — The directory to search in. Defaults to the current working directory. Must be an existing directory path — omit the parameter entirely to use the default; do not passnullor"undefined".
Output
Returns a list of matching file paths, relative to the working directory, sorted by modification time. Results are capped at 100 files. If the result is truncated, consider narrowing the pattern or specifying a more specific path.
Pattern examples
| Pattern | Matches |
|---|---|
**/*.ts | All TypeScript files anywhere in the tree |
src/**/*.tsx | All TSX files under src/ |
*.json | JSON files in the current directory only |
**/{package,tsconfig}.json | package.json and tsconfig.json at any depth |
tools/*/prompt.ts | prompt.ts one level inside tools/ |
Tip: Use
Globwhen you know the filename or extension you're looking for. For open-ended exploration that requires multiple rounds of searching, use theTask(Agent) tool instead.
Grep
Searches file contents using regular expressions, powered by ripgrep. Returns matching file paths, line numbers, and (optionally) matching lines.
Parameters
-
pattern(string) — A regular expression to search for in file contents. Supports full regex syntax: character classes, quantifiers, lookaheads, alternation, etc.Ripgrep syntax differs from POSIX
grepin one notable way: literal braces must be escaped. Useinterface\{\}to findinterface{}in Go code. -
path(string) — File or directory to search in. Defaults to the current working directory. Can be a single file path to restrict the search. -
glob(string) — Glob pattern to filter which files are searched (e.g.,"*.js","*.{ts,tsx}"). Maps torg --glob. -
type(string) — Ripgrep file type to restrict the search (e.g.,"js","py","rust","go","java"). More efficient thanglobfor standard file type filtering. Maps torg --type. -
output_mode(string) — Controls what is returned. Options:"files_with_matches"(default) — returns file paths only"content"— returns matching lines with context support"count"— returns match counts per file
-
-i(boolean) — Case-insensitive search. Maps torg -i. -
-n(boolean) — Show line numbers in output. Applies tooutput_mode: "content"only. Defaults totrue. -
-A(number) — Lines of context to show after each match. Applies tooutput_mode: "content"only. Maps torg -A. -
-B(number) — Lines of context to show before each match. Applies tooutput_mode: "content"only. Maps torg -B. -
context(number) — Lines of context to show before and after each match (equivalent torg -C). Takes precedence over-Aand-B. Applies tooutput_mode: "content"only. -
multiline(boolean) — Enable multiline mode where.matches newlines and patterns can span multiple lines (rg -U --multiline-dotall). Default:false. -
head_limit(number) — Limit output to the first N lines or entries (equivalent to| head -N). Applies across all output modes. Defaults to 250. Pass0for unlimited results. -
offset(number) — Skip the first N entries before applyinghead_limit(equivalent to| tail -n +N). Useful for paginating large result sets. Defaults to0.
Output modes
files_with_matches (default)
Returns a list of file paths that contain at least one match, sorted by modification time.
```
Found 3 files
src/utils/permissions/bashClassifier.ts
src/tools/BashTool/BashTool.tsx
src/tools/BashTool/bashPermissions.ts
```
content
Returns the matching lines themselves, with optional surrounding context.
```
src/utils/permissions/bashClassifier.ts:42:export function classifyBashCommand(
src/utils/permissions/bashClassifier.ts:43: command: string,
```
count
Returns match counts per file.
```
src/utils/permissions/bashClassifier.ts:7
src/tools/BashTool/bashPermissions.ts:3
Found 10 total occurrences across 2 files.
```
Pattern syntax notes
Escaping braces for Go / TypeScript
Ripgrep treats { and } as literal characters by default, unlike some regex engines that use them for quantifiers. To search for literal braces, escape them:
interface\{\} → finds interface{}
map\[string\] → finds map[string]
Multiline patterns
By default, . does not match newlines. To search across line boundaries:
{
"pattern": "struct \\{[\\s\\S]*?field",
"multiline": true
}
Combining glob and type filters
glob and type can be used independently or together:
{ "pattern": "TODO", "type": "ts" }
{ "pattern": "TODO", "glob": "src/**/*.ts" }
Use type for standard language types; use glob when the file set doesn't align with a named type.
Excluded directories
Grep automatically excludes version-control metadata directories: .git, .svn, .hg, .bzr, .jj, .sl.