PCのバックアップを取っている外付けUSBディスク(Bドライブ、1TB)が、いつの間にか満杯になっていた。空きは約4MBしかない。BドライブにはWindowsのバックアップ(システムイメージなど)と、ファイル履歴を入れている。
気づいたきっかけは、Bドライブを内蔵HDD(Gドライブ)にコピーするrobocopyが、「ディスクに十分な空き領域がありません」(エラー112)で止まったことだった。この時のフォルダが見えなくなった話は、robocopyでコピー先フォルダが非表示になる原因と直し方に書いた。
中身を調べると、ファイル履歴が約510GBあり、そのうち約444GBがCodexとClaude Codeの会話ログだった。PC側の会話ログは合わせて約42GBしかないのに、ファイル履歴の中では10倍以上に膨らんでいた。
結論から書くと、会話ログは使うたびに書き足されて大きくなり、ファイル履歴は変わったファイルを毎時コピーして版として残す。しかも版の保持は初期設定で「無期限」なので、数GBのファイルが1時間ごとに丸ごと増えていくのが原因だった。ファイル履歴の対象から.codexと.claudeを外し、会話ログはrobocopyで最新版だけを別にコピーする形にした。
何が容量を使っていたか
Bドライブのファイル履歴(約510GB)の内訳はこうだった。
| フォルダ | ファイル履歴の中のサイズ | PC側(Cドライブ)のサイズ |
|---|---|---|
.codex\sessions(Codexの会話ログ) |
234GB | 15GB |
.codexのそれ以外 |
83GB | 24GB |
.claude\projects(Claude Codeの会話ログ) |
127GB | 約3.5GB(.claude全体) |
どちらもユーザーフォルダ(C:\Users\<User>)の直下にある隠しフォルダで、私のPCではファイル履歴の対象に入っていた。
いちばん大きかったのは、9/13に始めたCodexの会話ログだ。PC側では7.3GBのファイル1つだが、ファイル履歴には42版たまっていて、合計165GBあった。11/4の1日だけで、ほぼ同じ7.3GBの版が7つ保存されていた。1つのファイルで最も多いものは348版あった。
しかも、ファイル履歴に残っていた版は10/15〜11/7の約3週間分だけだった。古い版がたまったのではなく、ここ数週間でAIツールを使う量が増えて、一気に膨らんでいた。PC側の会話ログも、9月は約1GB、10月は約22GB、11月は8日間で約20GB増えている。
原因:ファイル履歴は変わったファイルを毎時コピーし、版を無期限に残す
Microsoftのファイル履歴の解説には、次のように書かれている。
- 初期設定では1時間ごとに変更を調べて、変わったファイルを別の場所にコピーする
- 版は初期設定では無期限に残す。保存先がいっぱいになるなら、保持する期間を短くできる
- 大きなファイルがあって保存先の容量をすぐに使い切る場合は、そのフォルダを除外できる
(出典: Protecting user files with File History - Microsoft Learn、Windows 8: File History explained - Microsoft Learn)
会話ログは、会話のたびに末尾へ書き足されていくファイルだ。1行増えただけでもファイルは「変わった」ことになる。実際、ファイル履歴の中の版はどれもほぼ同じ7.3GBで、差分ではなくファイルが丸ごと保存されていた。つまり、7GBのファイルを使っている間は、1時間に最大7GBずつ増えていく。私のPCではファイル履歴の保持が「無期限」のままだったので、消えることもなかった。
保持期間を「1か月」などに短くするだけでは足りない。計算すると、7GBのファイルが1日数回保存されるだけで、1か月で数百GBになる。なので、会話ログはファイル履歴から外すことにした。
対策①:ファイル履歴から.codexと.claudeを除外する
除外する手順は次のとおり。
- コントロールパネル →「ファイル履歴」を開く
- 左の「フォルダーの除外」→「追加」を押す
- どちらも隠しフォルダなので、フォルダを選ぶ画面のアドレス欄に次のパスを直接入れて追加する(
<ユーザー名>は自分のユーザー名にする)
C:\Users\<ユーザー名>\.codex C:\Users\<ユーザー名>\.claude
除外しても、PC側の会話ログは消えない。ファイル履歴に保存されなくなるだけだ。
あわせて、左の「詳細設定」で版を残す期間も見直した。「ファイルのコピーを保存する頻度」は「1時間ごと (既定値)」のまま、「保存されたバージョンを保持する期間」を「無期限」から「1年」に変えた。会話ログを除外していれば、毎時の保存でも容量はほとんど増えない。
私はこのタイミングで、ファイル履歴の保存先をBドライブからNASに変えた(「ドライブの選択」→「ネットワークの場所の追加」)。Bドライブにあった古いファイル履歴(B:\FileHistory)は消して、約510GBを空けた。
対策②:会話ログはrobocopyで最新版だけをNASへコピーする
ファイル履歴から外すと、PCを復元した時に会話ログが戻らなくなる。そこで、会話ログだけはrobocopyで「最新版を1つだけ」NASにコピーすることにした。robocopyは変わったファイルだけをコピーし、上書きするので、版は増えない。コピー先の容量はPC側と同じ約42GBで止まる。
使っているバッチがこれだ(NAS名は<NAS>に置き換えている)。
@echo off chcp 932 >nul set "dst=\\<NAS>\backup\会話ログ" set "logfolder=\\<NAS>\backup\バックアップ用ツール\会話ログロボコピー\log" set "logfile=%logfolder%\%date:~0,4%-%date:~5,2%-%date:~8,2%_chatlog.log" set "opts=/E /DCOPY:DAT /COPY:DAT /XJ /log+:"%logfile%" /np /R:2 /W:5" if not exist "%logfolder%\" mkdir "%logfolder%" if not exist "%logfolder%\" ( echo NAS に書き込めません: %logfolder% pause exit /b 1 ) set "result=OK" if exist "%USERPROFILE%\.codex\" ( robocopy "%USERPROFILE%\.codex" "%dst%\.codex" %opts% if errorlevel 8 set "result=NG" ) if exist "%USERPROFILE%\.claude\" ( robocopy "%USERPROFILE%\.claude" "%dst%\.claude" %opts% if errorlevel 8 set "result=NG" ) rem 93日より古いログを削除 forfiles /P "%logfolder%" /M "*.log" /D -93 /C "cmd /c del @file" 2>nul if "%result%"=="NG" ( echo コピーでエラーがありました。ログを確認してください: %logfile% pause exit /b 1 ) echo 完了しました。ログ: %logfile%
ポイントは次のとおり。
/MIR(ミラー)ではなく/Eにしている。PC側で会話を消しても、NASには残る。うっかり消した時の保険だ- 普段のユーザーで実行する(管理者として実行しない)。エクスプローラーでNASを開く時と同じ資格情報が使われるので、バッチにパスワードを書かずに済む
- robocopyの終了コードが8以上の時はエラーとして止まる。Microsoftのrobocopy - Microsoft Learnで、8以上はコピーに失敗したファイルがあることを表す
- バッチはShift_JIS(メモ帳の「ANSI」)で保存している。最初に別のシェルから実行した時に日本語のフォルダ名が文字化けしたので、先頭に
chcp 932を入れた
初回は41.4GBのコピーで、失敗は0だった。2回目は変わったファイル(約74MB)だけのコピーで、28秒で終わった。ただ、数GBの会話ログが更新されていると、そのファイルは丸ごとコピーし直すので、その時は数分かかる。
タスクスケジューラで自動で実行する
私はPCを毎日開くわけではないので、時刻だけを決めると動かない日が出る。そこで、「ログオンの10分後」と「毎日12時」の2つで実行するようにした。10分待つのは、NASにつながる前に動いて失敗するのを防ぐためだ。12時にPCが閉じていた日は、次に開いた時に実行される(-StartWhenAvailable)。
管理者として開いたPowerShellで次を実行する。ログオン時に動くタスクは作るのに管理者権限が要るが、実行は普段のユーザー権限(-RunLevel Limited)にしている。バッチのパスは、置いた場所に書き換える。
$a = New-ScheduledTaskAction -Execute 'D:\backup-scripts\会話ログをNASへコピー.bat' $t1 = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME; $t1.Delay = 'PT10M' $t2 = New-ScheduledTaskTrigger -Daily -At 12:00 $p = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Limited Register-ScheduledTask -TaskName '会話ログをNASへコピー' -Action $a -Trigger $t1,$t2 -Principal $p -Settings (New-ScheduledTaskSettingsSet -StartWhenAvailable) -Force
最後に「会話ログをNASへコピー」と「Ready」が表示されれば登録できている。各コマンドはRegister-ScheduledTask - Microsoft LearnとNew-ScheduledTaskSettingsSet - Microsoft Learnに載っている。
ちなみに、DドライブをNASにバックアップしているスクリプトもタスクスケジューラで毎日実行している。その中身はRobocopyでローカルフォルダのデータをID/パスワード付きのNASにバックアップするに書いた。
まとめ
- ファイル履歴は、変わったファイルを初期設定で1時間ごとにコピーし、版を無期限に残す
- CodexやClaude Codeの会話ログ(
.codex、.claude)は使うたびに大きくなるので、数GBのファイルが毎時丸ごと版として増える。私のPCでは約42GBの会話ログが、ファイル履歴の中で約444GBになっていた - ファイル履歴の「フォルダーの除外」で
.codexと.claudeを外す - 会話ログはrobocopyで最新版だけをNASにコピーし、タスクスケジューラで自動で実行する
AIツールを毎日使っていてファイル履歴を使っているなら、保存先の空きを一度見ておくとよい。


コメント