この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- まず
df -hとduで重い箇所を特定してから削除する- Python・Docker・パッケージマネージャのキャッシュは意外と大きい
findで巨大ファイルを一発検索してから判断する流れが安全
概要
EC2インスタンスやローカルのLinuxマシンで作業していると、気づいたらディスクが逼迫している、なんてことがよくある。毎回コマンドのオプションを調べ直すのが地味に面倒なので、コピペで試せる形にまとめておく。
削除前にまず「どこが重いか」を把握するのが大事なので、探索系のコマンドから始める。
まず現状を把握する
ディスク全体の使用状況
df -hファイルシステムごとの使用量を人間が読める単位で表示。Use% が高いパーティションから攻める。
重いディレクトリをトップレベルから絞り込む
# ルート直下で大きいものを探すdu -sh /* 2>/dev/null | sort -rh | head -20
# 特定ディレクトリを深掘りするdu -sh /var/* 2>/dev/null | sort -rh | head -20容量が大きいディレクトリを特定したら、そのパスを変えてさらに深掘りしていく。
100MB以上のファイルを一発で探す
find / -type f -size +100M 2>/dev/null | sort
# ファイルサイズも一緒に表示する場合find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -30想定外の場所に大きなファイルが転がっていることがある。ログのローテーション漏れやMLモデルのダウンロードキャッシュなど。
ncdu でインタラクティブに確認する(インストールが必要)
# Ubuntu/Debiansudo apt install ncdu
# CentOS/RHELsudo yum install ncdu
# 実行ncdu /カーソルキーで掘っていけるのでわかりやすい。インストールできる環境なら一番楽。
ログ・一時ファイルの削除
systemd ジャーナルログ
# 現在の使用量を確認journalctl --disk-usage
# 500MB 以下になるまで古いログを削除sudo journalctl --vacuum-size=500M
# 2週間より古いログを削除sudo journalctl --vacuum-time=2weeks放置していると /var/log/journal/ がじわじわ育っていく。
/var/log 以下の個別ログ
# ログファイルのサイズを確認ls -lhS /var/log/
# ファイルを空にする(削除せずゼロにする)sudo truncate -s 0 /var/log/syslogsudo truncate -s 0 /var/log/auth.logログファイルはプロセスが掴んだまま使っていることがあるので、rm より truncate のほうが安全。
/tmp の手動クリア
# サイズ確認du -sh /tmp
# 古いファイルを削除(例: 3日以上アクセスされていないもの)sudo find /tmp -atime +3 -deleteパッケージマネージャのキャッシュ
apt(Ubuntu / Debian)
# キャッシュのサイズ確認du -sh /var/cache/apt/
# ダウンロードキャッシュを削除sudo apt clean
# 不要なパッケージを削除sudo apt autoremove
# 両方まとめてsudo apt clean && sudo apt autoremoveyum / dnf(CentOS / RHEL / Fedora)
# yumsudo yum clean all
# dnfsudo dnf clean allPython 環境の掃除
pip キャッシュ
# キャッシュの場所とサイズ確認pip cache info
# キャッシュを全削除pip cache purge~/.cache/pip/ に溜まっていることが多い。
pycache を一括削除
# カレントディレクトリ以下の __pycache__ をすべて削除find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null
# .pyc ファイルも削除する場合find . -name "*.pyc" -deletevenv ディレクトリの確認と削除
# カレント以下の venv を探すfind . -type d -name "venv" -o -name ".venv" 2>/dev/null
# 不要なものを削除(パスを確認してから)rm -rf /path/to/project/venvconda の環境と不要ファイル
# 環境一覧を確認conda env list
# 不要な環境を削除conda env remove -n 環境名
# キャッシュや不要パッケージを削除conda clean --allDocker の掃除
DockerはPull済みのイメージやビルドキャッシュが気づかないうちに大量に溜まる。
まず使用量を確認
docker system dfImages / Containers / Volumes / Build Cache ごとのサイズが表示される。
一括クリーンアップ(停止コンテナ・タグなしイメージ・未使用ネットワーク)
docker system pruneすべての未使用イメージも含めて削除(より強力)
docker system prune -a使っていないイメージがすべて消えるので注意。
個別に削除したい場合
# 停止中のコンテナを全削除docker container prune
# タグなし(dangling)イメージを削除docker image prune
# 使われていないボリュームを削除docker volume prune
# ビルドキャッシュだけ削除docker builder pruneその他
古いカーネルを削除(Ubuntu)
# インストール済みカーネルを確認dpkg --list | grep linux-image
# 不要カーネルを削除(現在起動中のカーネルは消さないこと)sudo apt autoremove --purgeautoremove が自動的に古いカーネルも対象にしてくれる。
snap のキャッシュ・無効バージョンを削除
# snap のサイズ確認du -sh /var/lib/snapd/
# 無効(disabled)なスナップを削除snap list --all | awk '/disabled/{print $1, $3}' | while read name rev; do sudo snap remove "$name" --revision="$rev"donesnap は古いバージョンを自動的に2世代残すので、これで減らせる。
~/.cache 以下を確認
# ユーザーキャッシュのサイズを確認du -sh ~/.cache/du -sh ~/.cache/* 2>/dev/null | sort -rh | head -10ブラウザキャッシュ、pip、conda、その他アプリのキャッシュが集まっている。不要なサブディレクトリは個別に rm -rf でOK。
まとめ
| 対象 | 確認コマンド | 削除コマンド |
|---|---|---|
| ディスク全体 | df -h | — |
| 重いディレクトリ | du -sh /* | sort -rh | 手動判断 |
| 巨大ファイル | find / -size +100M | 手動判断 |
| journalログ | journalctl --disk-usage | journalctl --vacuum-size=500M |
| apt キャッシュ | du -sh /var/cache/apt | apt clean && apt autoremove |
| pip キャッシュ | pip cache info | pip cache purge |
| pycache | find . -name __pycache__ | find . -type d -name __pycache__ -exec rm -rf {} + |
| conda | conda env list | conda clean --all |
| Docker全体 | docker system df | docker system prune -a |
いつも忘れるのは du -sh のオプション順と find の size 指定あたり。次に詰まったらここを見ればたいていなんとかなるはず。