Claude Codeで必ず高速なGrep,Globツールを使うようにして低速なfind/grepコマンドを実行しないようにする

ブログ
claude-code-fast-grep.avif

Claude Codeが低速な grep/find コマンドを使ってしまう問題を解決する

(とりあえず結論だけ知りたい方はこちらです)

~/.claude/CLAUDE.md に以下のように記述します

Use fd, not find.
Use rg, not grep.

(詳しく見たい方はこちらからどうぞ)

クロートコードの使用ログを見てみると意外と低速なツールが使われていることがわかりますここでは

  1. ログを監視する
  2. 高速化ツールを使用してclaude codeを高速化する
  3. claude codeが高速化が実現されたことを確認する

の3ステップで解説していきます

1 . ログを監視する

hooks→PreToolUse / hooks→PostToolUse でツールの使用具合を監視する

settings.json に以下の設定を追加し続けて次の2つのファイルを新規作成します

~/.claude/settings.json

  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$HOME\"/.claude/hooks/log-tool-usage.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Grep|Glob",
        "hooks": [
          {
            "type": "command",
            "command": "\"$HOME\"/.claude/hooks/log-fast-tool-usage.sh"
          }
        ]
      }
    ]
  }

~/.claude/hooks/log-fast-tool-usage.sh

#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')


LOG="$HOME/.claude/logs/search-tool-usage.jsonl"
mkdir -p "$(dirname "$LOG")"


jq -nc --arg ts "$(date -u +%FT%TZ)" --arg tool "$TOOL" \
  '{ts:$ts, type:"fast", tool:$tool}' >> "$LOG"
exit 0

~/.claude/hooks/log-tool-usage.sh

#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')


LOG="$HOME/.claude/logs/search-tool-usage.jsonl"
mkdir -p "$(dirname "$LOG")"


if echo "$COMMAND" | grep -Eq '(^|[;&|]\s*)(grep|egrep|fgrep|find)\b'; then
  jq -nc --arg ts "$(date -u +%FT%TZ)" --arg cmd "$COMMAND" \
    '{ts:$ts, type:"slow", tool:"Bash", command:$cmd}' >> "$LOG"
fi


exit 0

log-fast-tool-usage.sh , log-tool-usage.sh を実行可能にする

chmod +x log-fast-tool-usage.sh
chmod +x log-tool-usage.sh

これで claude code でツールを実行するたびに、次の箇所にログがたまります。

~/.claude/logs/search-tool-usage.jsonl


ここに find や grep などの遅いツールが使われているかどうかをまず確認します。

もし使われているようなら次の工程でそれらを高速ツールに置き換えましょう

2 . 高速化ツールを使用してclaude codeを高速化する

先ほどの作業でまれにでBash経由の遅いfind/grepを使っていることがわかりました。

Claude Codeには元々ripgrepベースの高速なGrepツールとGlobツールが組み込まれているのですが、これらは使われず、素のfind/grepコマンドが実行されています。

claude codeのフックスクリプトを作る

.claude/hooks/prefer-fast-search.shを作成します。

#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
TOOL=$(echo "$INPUT" | jq -r '.tool_name')


LOG="$HOME/.claude/logs/search-tool-usage.jsonl"
mkdir -p "$(dirname "$LOG")"


log_prompt() {
  local matched="$1"
  jq -nc --arg ts "$(date -u +%FT%TZ)" --arg tool "$TOOL" --arg matched "$matched" \
    '{
      ts: $ts,
      type: "prompted_fast_tools",
      tool: $tool,
      hook: "prefer-fast-search",
      matched: $matched,
      message: "grep/find を検出し、高速ツールへの移行を促した"
    }' >> "$LOG"
}

if echo "$COMMAND" | grep -Eq '(^|[;&|]\s*)find\b'; then
  log_prompt "find"
  echo "Use fd, not find." >&2
  exit 2
fi

if echo "$COMMAND" | grep -Eq '(^|[;&|]\s*)(grep|egrep|fgrep)\b'; then
  log_prompt "grep"
  echo "Use Grep tool or rg, not grep." >&2
  exit 2
fi

exit 0

実行権限を付けます。

chmod +x .claude/hooks/prefer-fast-search.sh

.claude/settings.jsonに登録します。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$HOME\"/.claude/hooks/prefer-fast-search.sh"
          }
        ]
      }
    ]
  }
}

念のためにrg,fdコマンドをインストールしておく

claude code には 内部的に高速な検索ツールがインストールされますが使用されないこともあるので明示的にインストールしておきます

brew install ripgrep
brew install fd


これで高速化の設定が完了です

これで低速ツールが実行されるとした時に必ず高速ツールが使われるようになります。

ログファイルを見てみると高速ツールへ促されたことそしてその後に高速ツールが起動されたことが確認できます ↓

{"ts":"2026-09-07T23:22:47Z","type":"slow","tool":"Bash","command":"grep -rl \"log_prompt\" /Users/test/.claude/hooks"}
{"ts":"2026-09-07T23:22:47Z","type":"prompted_fast_tools","tool":"Bash","hook":"prefer-fast-search","matched":"grep","message":"grep/find を検出し、高速ツールへの移行を促した"}
{"ts":"2026-09-07T23:22:49Z","type":"fast","tool":"rg"}

料金への影響は?

フック追加によるコスト増はあるのか?

  • type: "command"のフックはただのシェルスクリプト実行であり、モデル呼び出しを伴わないため、フック自体には課金が発生しない
  • ブロック時に拒否理由が会話履歴に載るため、その分だけ多少コンテキストは増える(数十トークン程度)
  • とはいえ、非効率なfind/grepの大きな出力を毎回読み込むコストと比べれば誤差程度で、セッションが進むほどClaudeが学習して最初からGrep/Globを選ぶようになるため、トータルではむしろ削減方向に働くといえるでしょう。
  • フックスで返す文字列は Use fd, not find. のようなとても短い文字列 ですが、
  • 気になる場合はcloud.mdでプロンポートに指示をしておくのも良いと思います。

ぜひご活用ください!

一覧へ戻る