◉CLAUDE LABEN
●2.1.295 — hook に onFailure: "block" が追加。起動失敗や想定外の終了でも通さず止められます●SONNET 4.5 — Claude API での提供終了は 11/30、残り52日。移行先は Sonnet 5.5●HAIKU 5.5 — Haiku 4.5 向けコードは budget_tokens が 400 エラーになる点に注意●Q&A — 同じコネクタを別アカウントで併用したい、という問いが出ています●API CACHE — Sonnet 5.5 のキャッシュ読み取りが $0.10/Mtok に値下げ(10/07)●NEW — 毎回読ませる指示ファイルを半分にする前に、残す・移す・消すを分ける●2.1.295 — hook に onFailure: "block" が追加。起動失敗や想定外の終了でも通さず止められます●SONNET 4.5 — Claude API での提供終了は 11/30、残り52日。移行先は Sonnet 5.5●HAIKU 5.5 — Haiku 4.5 向けコードは budget_tokens が 400 エラーになる点に注意●Q&A — 同じコネクタを別アカウントで併用したい、という問いが出ています●API CACHE — Sonnet 5.5 のキャッシュ読み取りが $0.10/Mtok に値下げ(10/07)●NEW — 毎回読ませる指示ファイルを半分にする前に、残す・移す・消すを分ける
記事一覧/Claude Code
⟐ Claude Code/2026-08-25中級

空白ひとつで、80件の検査が0件になる — 一括処理を任せる前に置くガード

空白を含むフォルダ名の下で走らせた検査ループが、80件のうち1件も開いていませんでした。断片が実在パスに化ける仕組みを実測で切り分け、削除を伴うバッチに置く件数アサーションまで書き残します。

Claude Code260bash5自動化87個人開発128運用23

✦ プレミアム記事

作業フォルダの中に散らばったドキュメントを一通り点検したくて、拡張子で拾って先頭バイトを読むだけの短いループを書きました。80件ほどあるはずのファイルです。

走らせると、こう出ました。

checked=80 readable=0 unreadable=80

80件を検査して、1件も読めていません。最初は同期の問題を疑いました。クラウド同期のフォルダを作業場所にしているので、実体がまだ降りてきていないのだろう、と。

けれど cat で個別に開くと、どれも普通に読めます。中身も欠けていません。

原因はファイルの側ではありませんでした。フォルダ名に空白が一つ入っていた、それだけです。

検査したはずの80件が、160回に増えていた

問題のループはこういう形をしていました。個人開発の点検スクリプトでは、おそらく最も書かれている形です。

for f in $(find "$ROOT/_documents" -type f -name "*.md"); do
  if head -c 1 "$f" >/dev/null 2>&1; then ok=$((ok+1)); else ng=$((ng+1)); fi
done

"$ROOT/_documents" はきちんとクォートしてあります。ループ変数の "$f" もクォートしてあります。それでも壊れます。

壊れているのは $( ) の外側です。コマンド置換の結果は、クォートされていない位置に置かれた時点で IFS(既定では空白・タブ・改行)によって単語分割されます。find が返した1行のパスが、空白のところで二つに割れます。

実際に数えてみます。空白を含むディレクトリの下に100バイトのファイルを80件置いて、同じループを回した結果です。

=== A: コマンド置換・非クォート ===
iterations=160 readable=0 unreadable=160  (実ファイル数=80)

イテレーションが160。ファイル数のちょうど2倍です。パスが2つの断片に割れ、その断片一つひとつをファイル名だと思ってループが回っていました。当然どちらも開けません。

find を -print0 で出し、NUL 区切りで読む形に変えると、こうなります。

while IFS= read -r -d '' f; do
  head -c 1 "$f" >/dev/null 2>&1 && ok=$((ok+1))
done < <(find "$ROOT/_documents" -type f -name "*.md" -print0)
=== B: find -print0 + while read -d '' ===
iterations=80 readable=80 unreadable=0

80件、全件読めました。ファイルは最初から何も壊れていなかったわけです。

断片が「実在するパス」に化けるとき

ここまでなら「読めなかっただけ」で済みます。実際に背筋が冷えたのは、次を確かめたときでした。

割れた断片のうち、前半は実在するディレクトリになり得ます。

/work/Dolice Labs/out/tmp_1.txt が割れると、前半は /work/Dolice です。もし同じ階層に Dolice という別のフォルダが本当に存在していたら、その断片は「存在しないゴミ」ではなく「実在する別の場所」を指します。

検証用に、消したいファイルを Dolice Labs/out/ に5件、消してはいけないファイルを Dolice/keep/ に3件置き、素朴なループで削除を回しました。

for f in $(find "$T/Dolice Labs/out" -type f -name "tmp_*.txt"); do
  rm -rf "$f" 2>/dev/null
done

結果です。

before: keep=3 tmp=5
after : keep=0 tmp=5
対象意図実行前実行後
Dolice Labs/out/消したい5件5件(1件も消えていない)
Dolice/keep/消してはいけない3件0件(全部消えた)

意図した対象は一つも消えず、触れてはいけない側が全滅しました。しかもループの終了コードは 0 で、標準エラーには1行も出ません。

rm -rf "$f" の "$f" はクォートしてあります。クォートは断片を「1つの引数」として渡すことしか保証しません。その断片がどこを指すかまでは面倒を見てくれない、というのがこの現象の芯です。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦空白を含むパスの下で一括処理を任せる前に、自分のスクリプトが黙って全件を落とす形になっていないかを数分で判定できるようになる
✦「対象が0件だった」と「0件しか開けなかった」を、処理件数の突き合わせで機械的に切り分けられるようになる
✦同じループが、消したい5件を残したまま消してはいけない3件を消した実測から、削除を伴うバッチのどこにガードを置くかを決められるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-09-03
ログのタイムゾーンを表示で寄せるか、記録で固定するか
AdMob とストアのレポートと手元のログで一日の切れ目がずれていました。表示側に寄せる方法と記録側を固定する方法を、実際に往復して選び直した判断の記録です。
⟐ Claude Code2026-08-31
無音で半分になっていた定期実行と、欠落を捕まえる突き合わせ
1日2回動いているはずのバッチが、実際には1回しか起動していませんでした。エラーは1件も出ていません。期待起動回数と実行記録を突き合わせて、無音の欠落を検出する仕組みを作ります。
⟐ Claude Code2026-08-22
長い処理を別セッションに任せて待つ — 通知が届かなかったときのための完了マーカー
Claude Code の notify_when_idle で別セッションの完了通知を受け取る手順と、通知が落ちても待ち続けないための完了マーカーの最小実装。3つの状態切り分けを実行結果つきで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます