
開発用の MacBook Air(245GB)の空きが 19GB まで減っていた
システム設定のストレージを見ると、書類が 79GB、システムデータが 72GB
書類(79GB)なにこれ?と思った
犯人は、npm のキャッシュ(24GB)と、Next.js の開発サーバーが溜め込んだ .next(23GB)であった
半日かけて片付けた結果、空きは 93GB になった。Mac を新調せずに済んだと思った。消したものの大半は、あとから自動で作り直されるキャッシュとビルドの作業用ファイルだった
消す前にバックアップを取る
最初にやったのはバックアップ
Time Machine は使っていない。レガシーな感じがするからだ
Google Drive のアプリは入れてない。重いからだ
restic と rclone で ~/Projects を Google Drive に送る形にした
- restic:暗号化して差分だけを送るバックアップツール
- rclone:クラウドをコマンドで扱う。restic の保存先に使う
restic は Drive 上に暗号化した塊として保存する
Drive の画面からファイルを開くことはできない
その代わり、.env の鍵や客先のデータが平文で Drive に残らず、日ごとの版も残る
node_modules や .next のように作り直せるものは除外した
~/Projects の 52GB のうち 34GB がこれにあたり、実際に送るのは約17GB になった
圧縮と重複の排除で、Drive 上は約10GB に収まっている
いくつか気をつけた点がある
- 共有の client_id は廃止予定。自分の OAuth クライアントで接続
- rclone の権限は drive.file。自分が作ったファイルにしか触れない
- Drive は Gmail と容量を共有。20GB を超えたら通知を出す
- launchd で毎日昼に実行。スリープ中に過ぎたら起きたときに走る
- パスワードはキーチェーンと 1Password に。無くすと復元できない
定期実行に Claude Code のスケジュール機能は使わなかった
/schedule はクラウドで動くので、手元の ~/Projects を読めない
セッションの中で回す cron は、セッションを閉じると止まる
毎日決まった時刻に手元のファイルを読むなら、macOS の launchd がいちばん確実だった
初回は約12万ファイルを37分で送った
2回目からは変わった分だけなので、数十秒で終わる
1ファイルを戻すテストと、restic check --read-data-subset=10% でデータを1割読み出す検査まで済ませた
どこが大きいかを測る
システム設定のストレージ表示は分類が大まかで、何を消せばよいかまでは分からない
ホームディレクトリの直下から du で順に測っていった
測ってみると、大きいのは開発ツールのキャッシュだった
| 場所 | 大きさ | 中身 |
|---|---|---|
| ~/.npm/_cacache | 24GB | npm のダウンロード済みパッケージ |
| ~/.cache/uv | 13GB | Python のパッケージ管理ツール uv のキャッシュ |
| ~/Library/Containers/com.docker.docker | 15GB | Docker の仮想ディスク |
| 各プロジェクトの .next | 合計 約23GB | Next.js の開発サーバーとビルドの作業用 |
| 各プロジェクトの node_modules | 合計 約9GB | 依存パッケージ |
消しても作り直せるもの
npm と uv のキャッシュは、それぞれ専用のコマンドで空にした
次に npm install するときに必要な分だけダウンロードし直されるので、困ることはない
この2つで約37GB が空いた
Next.js の .next は、開発サーバーを動かしていると数 GB 単位で膨らむ
いちばん大きいものは 9.9GB あり、ほぼ全部が開発サーバー用の .next/dev だった
動いている開発サーバーの .next を消すと表示が壊れるので、サーバーを止めてから消した
次に起動したときに作り直される
node_modules は、最後のコミットから数か月たったプロジェクトの分だけ消した
1つあたりは 0.4〜0.8GB で、6つで約3GB だった。使うときに npm install すれば戻る
Docker は中を消しても縮まない
Docker Desktop は、コンテナや image を1つの大きな仮想ディスク(Docker.raw)の中に置いている
docker system prune で使っていない image を消しても、この仮想ディスクは縮まず、Mac の空きは増えなかった
ローカルの WordPress 環境が5つ残っていたが、どれもほとんど使っていなかった
まだ使う可能性がある2つは、データベースを mysqldump で書き出し、アップロード画像の volume を tar で固めてから iCloud に置いた
プロジェクトの README に、書き出した場所と戻し方を書いておいた
パスワードはコンテナの環境変数から読むので、コマンドや画面には出てこない
そのあとコンテナ、volume、image をすべて消し、Docker Desktop を終了した
終了したあとで、仮想ディスクは 15GB から 1.9GB に縮んだ
Docker.raw は中身のある部分だけが実際の容量を使うファイルなので、中を消したうえで Docker を終了させると、そのぶんが Mac に返る
1つ失敗がある
4月から触っていない環境は書き出さずに消したところ、そのうち1つのデータベースはどこにも控えがなかった
テーマのコードと画像はプロジェクトのフォルダに残っていたので実害は小さかったが、データベースは volume の中にしか無く、ファイルのバックアップには入らない
Docker の volume を消す前には、使っていないつもりの環境でも書き出しておくほうがいい
使っていない開発環境を外す
Rust の toolchain が 1.5GB あった
~/Projects に Rust のプロジェクトが1つもなかったので、toolchain と rustup を外した
iCloud に逃がす
~/Documents は iCloud Drive と同期していて、du で測ると 76KB しかなかった
ls -lO を見ると、ほとんどのファイルに dataless の印が付いている
実体は iCloud にあり、Mac には名前などの情報だけが置かれている状態だった
ファイルの大きさとして数えると、958ファイル、約220MB あった
この仕組みを使い、手元に置いておく必要のないものを ~/Documents に移した
- ~/Downloads の中身
- 終わった作業の置き場にしていたフォルダ(1.4GB)
- 終わった案件の調査データ(約1.1GB)
元の場所から参照しているものは、同じ名前のシンボリックリンクを置いて、パスが変わらないようにした
ただし、移したからといってすぐに Mac の空きが増えるわけではない
「Mac のストレージを最適化」がオンになっていて、空きが少なくなったときに、macOS が手元の実体を外す
写真ライブラリ(2.6GB)も同じ設定になっていたが、空きが十分あるので、今は手元に残っている
残したもの
Hugging Face のキャッシュには、文字起こしに使う Whisper のモデル(2.9GB と 1.5GB)が入っていた
消してもダウンロードし直されるが、毎回使うものなので残した
ブラウザやチャットアプリのデータも、普段使っているので触っていない
結果
| やったこと | 空いた容量 |
|---|---|
| npm と uv のキャッシュを消す | 約37GB |
| 開発サーバーの .next を消す | 約23GB |
| 古いプロジェクトの node_modules を消す | 約3GB |
| Docker を空にして終了する | 約13GB |
| Rust を外す | 約1.5GB |
空きは 19GB から 93GB になった
表の合計と増えた空きが少しずれるのは、測った時点と、macOS が空き容量を数え直すタイミングの違いによる
つまずいたこと
Claude Code の入力欄では、先頭に ! を付けるとそのセッションの中でシェルのコマンドが動く
同じ1行をふつうのターミナルに貼ると、! は「直後のコマンドの成否を反転する」という意味になる
! cd ~/Projects && rm -rf … を実行すると cd が失敗した扱いになり、後ろの rm は実行されなかった
AI のエージェントに片付けを任せる場合、rm -rf のような消去は権限の設定で止まることが多い
今回は消す対象の一覧をエージェントに作らせ、消すコマンドだけを自分で実行した
一覧を目で確かめてから自分で消す形になるので、かえって安心できた