# Efficient File Searching with ripgrep: Commands and Best Practices

> Learn efficient file searching with ripgrep rg. Discover commands and best practices to quickly find files in your codebase, outperforming grep.

- Repository: [Joshua Levy/the-art-of-command-line](https://github.com/jlevy/the-art-of-command-line)
- Tags: how-to-guide
- Published: 2026-02-24

---

**Ripgrep (`rg`) is a Rust-based search utility that outperforms traditional `grep -r` by respecting `.gitignore` files, utilizing SIMD optimizations, and providing sensible defaults for scanning source code.**

Efficient file searching with ripgrep is explicitly recommended in *The Art of Command Line*, the widely-used open-source guide maintained by Josh Levy. According to the repository's [`README.md`](https://github.com/jlevy/the-art-of-command-line/blob/main/README.md) in the "Processing files and data" section around line 219, ripgrep serves as the modern replacement for legacy tools like `grep`, `ack`, and the Silver Searcher (`ag`). The guide emphasizes ripgrep's combination of aggressive performance optimizations and developer-friendly defaults that automatically skip binary files and ignored directories.

## Why ripgrep Outperforms Traditional Tools

Unlike standard `grep`, ripgrep is built on Rust's regex engine and implements aggressive SIMD optimizations. This architecture makes it significantly faster when scanning large codebases. The tool respects `.gitignore` files by default, automatically excluding files that are not part of the project, and offers sensible binary-file detection out-of-the-box. These characteristics align with the guide's goal of providing "quick, reliable, and concise" command-line solutions.

## Essential ripgrep Commands

### Recursive Text Search

To search for a literal string recursively in the current directory, use the basic syntax:

```bash
rg "TODO"

```

This command searches for the string "TODO" across all files while respecting ignore rules.

### Case-Insensitive Matching

When you need to match regardless of case:

```bash
rg -i "error"

```

This finds "error", "Error", "ERROR", and other case variations.

## Filtering by File Type and Location

### Targeting Specific File Types

Limit your search to particular programming languages using the type flag:

```bash
rg -tpy "def "

```

This searches only Python files (`*.py`) for function definitions.

### Excluding Directories

Skip irrelevant directories like `node_modules` or `vendor`:

```bash
rg "TODO" --ignore-dir=node_modules

```

This prevents searching through dependency folders in large projects.

### Controlling Search Depth

Limit recursion to avoid overly broad scans:

```bash
rg "TODO" --max-depth 2

```

This searches only two directory levels deep.

### Searching Hidden Files

To include hidden files and disable ignore rules:

```bash
rg "secret" -uu

```

The `-u` flag disables ignore rules, while `-uu` also includes hidden files and `.gitignore`d files.

## Advanced Pattern Matching

### Regular Expression Searches

Use the `-e` flag for complex patterns:

```bash
rg -e '^class\s+\w+\s*{'

```

This finds C-style class definitions using a regular expression.

### Displaying Context Lines

Show surrounding lines for better context:

```bash
rg -C 2 "password"

```

This displays two lines before and after each match, similar to `grep -C`.

### Line Number Output

Force display of line numbers and filenames:

```bash
rg -n "FIXME"

```

This prints matches in `file:line:match` format, which the guide recommends for quick navigation.

## Workflow Integration

### Piping Results to Other Commands

List files containing matches and pipe to other utilities:

```bash
rg -l "TODO" | xargs -r rm

```

This lists files containing "TODO" and deletes them. Use with caution.

### Exporting Results

Save search output for later analysis:

```bash
rg "FIXME" > fixes.txt

```

This redirects all matches to [`fixes.txt`](https://github.com/jlevy/the-art-of-command-line/blob/main/fixes.txt).

### Git Repository Integration

Search only tracked files in a Git repository:

```bash
git ls-files | rg "TODO"

```

This complements ripgrep's built-in ignore handling by restricting the search to files tracked by Git.

## Summary

- **Ripgrep** (`rg`) is the recommended modern replacement for `grep -r` in *The Art of Command Line* repository.
- The tool uses Rust's regex engine and **SIMD optimizations** for superior performance.
- It respects **`.gitignore`** and excludes binary files automatically.
- Use **`-t`** to filter by file type and **`--ignore-dir`** to exclude directories.
- The **`-u`** flag controls whether hidden and ignored files are included.
- Results can be piped to other commands or saved to files for further processing.

## Frequently Asked Questions

### How does ripgrep achieve better performance than grep?

Ripgrep is built on Rust's regex engine and utilizes aggressive SIMD optimizations, making it significantly faster than traditional `grep`, `ack`, or the Silver Searcher (`ag`). It also parallelizes searches and respects `.gitignore` files by default to avoid wasting cycles on irrelevant files.

### Does ripgrep respect .gitignore files automatically?

Yes, ripgrep respects `.gitignore` files by default, automatically skipping files that are not part of the project. This behavior aligns with the tool's design philosophy of providing sensible defaults for source code searching.

### Can I limit ripgrep searches to specific file types?

Yes, use the `-t` flag followed by the type shorthand. For example, `rg -tpy "pattern"` searches only Python files, while `rg -tjs "pattern"` targets JavaScript files. This is implemented in the core search functionality referenced in the repository's recommendations.

### How do I include hidden files in a ripgrep search?

Use the `-uu` flag to search hidden files and files listed in `.gitignore`. A single `-u` disables ignore rules partially, while `-uu` fully includes hidden files, making it useful for searching configuration files and dotfiles.