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

Claude Codeが低速な grep/find コマンドを使ってしまう問題を解決する
(とりあえず結論だけ知りたい方はこちらです)
~/.claude/CLAUDE.md に以下のように記述します
Use fd, not find.
Use rg, not grep.(詳しく見たい方はこちらからどうぞ)
クロートコードの使用ログを見てみると意外と低速なツールが使われていることがわかりますここでは
- ログを監視する
- 高速化ツールを使用してclaude codeを高速化する
- 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 0log-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でプロンポートに指示をしておくのも良いと思います。
ぜひご活用ください!