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
A glob pattern to match file paths against. Supports
* (any characters within a path segment), ** (any number of path segments), and ? (single character).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 pass
null or "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 specificpath.
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/ |
Grep
Searches file contents using regular expressions, powered by ripgrep. Returns matching file paths, line numbers, and (optionally) matching lines.Parameters
A regular expression to search for in file contents. Supports full regex syntax: character classes, quantifiers, lookaheads, alternation, etc.Ripgrep syntax differs from POSIX
grep in one notable way: literal braces must be escaped. Use interface\{\} to find interface{} in Go code.File or directory to search in. Defaults to the current working directory. Can be a single file path to restrict the search.
Glob pattern to filter which files are searched (e.g.,
"*.js", "*.{ts,tsx}"). Maps to rg --glob.Ripgrep file type to restrict the search (e.g.,
"js", "py", "rust", "go", "java"). More efficient than glob for standard file type filtering. Maps to rg --type.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
Case-insensitive search. Maps to
rg -i.Show line numbers in output. Applies to
output_mode: "content" only. Defaults to true.Lines of context to show after each match. Applies to
output_mode: "content" only. Maps to rg -A.Lines of context to show before each match. Applies to
output_mode: "content" only. Maps to rg -B.Lines of context to show before and after each match (equivalent to
rg -C). Takes precedence over -A and -B. Applies to output_mode: "content" only.Enable multiline mode where
. matches newlines and patterns can span multiple lines (rg -U --multiline-dotall). Default: false.Limit output to the first N lines or entries (equivalent to
| head -N). Applies across all output modes. Defaults to 250. Pass 0 for unlimited results.Skip the first N entries before applying
head_limit (equivalent to | tail -n +N). Useful for paginating large result sets. Defaults to 0.Output modes
- files_with_matches (default)
- content
- count
Returns a list of file paths that contain at least one match, sorted by modification time.
Pattern syntax notes
Escaping braces for Go / TypeScript
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:Multiline patterns
Multiline patterns
By default,
. does not match newlines. To search across line boundaries:Combining glob and type filters
Combining glob and type filters
glob and type can be used independently or together: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.