Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Dec 28, 2025 - 日記

エンジニアの年末大掃除 2025(後編):ディスク容量の奪還とバックアップ体制の見直し

エンジニアの年末大掃除 2025(後編):ディスク容量の奪還とバックアップ体制の見直し

前編 では、1年間の統計振り返りとGitリポジトリの大掃除を行いました。後編では、ディスク容量の奪還とシステム環境の最適化に取り組みます。

node_modules、Dockerイメージ、Homebrewの古いパッケージ…。これらを一掃して、新年を軽快なマシンで迎えましょう。

💾 ディスク容量の奪還作戦

開発環境で最も容量を圧迫するのは、ビルドアーティファクトと依存関係です。効率的に削除していきましょう。

ディスク容量の整理とクリーンアップ

dust: duの代替、直感的なディスク使用量表示

dust は、Rust製のdu代替ツールです。従来のduコマンドよりも視覚的で、どのディレクトリが容量を食っているのか一目でわかります。

インストール

# macOS
brew install dust

# Linux (Cargo経由)
cargo install du-dust

基本的な使い方

# カレントディレクトリのディスク使用量を表示
dust

# 特定ディレクトリを調査
dust ~/work

# 3階層まで表示
dust -d 3

# ファイルサイズでソート(降順)
dust -r

dustは、ディレクトリツリーを視覚的にバー表示し、どのフォルダが親ディレクトリに属するかを色分けで示してくれます。容量の大きいディレクトリを素早く特定できます。

kondo: ビルドアーティファクトの一括削除

kondo は、Rust製のプロジェクトクリーナーです。node_modulestargetbuildなど、20種類以上のプロジェクトタイプに対応しています。

注意: kondoはルートディレクトリ(~~/workなど)では正しく動作しない既知のバグ があります。プロジェクトが含まれるサブディレクトリを明示的に指定してください。

インストール

# macOS
brew install kondo

# Windows
winget install kondo

# Cargo経由
cargo install kondo

基本的な使い方

# カレントディレクトリ配下のプロジェクトを検出
kondo

# 特定のプロジェクトディレクトリをスキャン(推奨)
kondo ~/work/project1 ~/work/project2

# 複数のプロジェクトを一度にスキャン
kondo ~/work/my-app ~/work/another-project

# ドライラン(削除せずに確認のみ)
kondo --dry-run ~/work/project1

# 3ヶ月以上更新のないプロジェクトのみ対象
kondo --older 3M ~/work/project1

# 確認なしで一括削除(注意!)
kondo --all ~/work/project1

NG例: kondo ~/work のようにプロジェクトファイル(package.jsonなど)がないディレクトリを指定すると、何も検出されずに終了します。

kondoは以下のようなプロジェクトアーティファクトを検出・削除します:

  • Node.js: node_modules
  • Rust: target
  • Python: __pycache__, .venv, venv
  • Elixir: _build, deps
  • Unity: Library, Temp
  • C#/.NET: bin, obj
  • など20種類以上

実行すると、「このプロジェクトを削除しますか?」と対話的に確認してくれるので安心です。

ncdu: インタラクティブなディスク使用量分析

ncdu (NCurses Disk Usage)は、TUIでディスク使用量を分析できるツールです。キーボードでディレクトリを探索し、その場でファイルを削除できます。

インストール

# macOS
brew install ncdu

# Ubuntu/Debian
sudo apt install ncdu

基本的な使い方

# カレントディレクトリをスキャン
ncdu

# 特定ディレクトリをスキャン
ncdu ~/work

操作方法:

  • 矢印キー: 上下移動
  • Enter: ディレクトリに入る
  • d: 選択したファイル/ディレクトリを削除
  • q: 終了

ncduは、容量の大きいディレクトリを対話的に探索したい場合に最適です。

npkill: node_modules専用クリーナー

npkill は、Node.jsプロジェクトのnode_modulesに特化した削除ツールです。

使い方

# npxで実行(インストール不要)
npx npkill

# 特定ディレクトリをスキャン
npx npkill --directory ~/work

実行すると、すべてのnode_modulesディレクトリが一覧表示され、容量と共に表示されます。スペースキーで削除対象を選択し、一括削除できます。

Docker の大掃除

Dockerイメージとコンテナは、気づかないうちに容量を圧迫します。

# 現在のDocker使用量を確認
docker system df

# 停止中のコンテナ、未使用イメージ、未使用ネットワーク、ビルドキャッシュを削除
docker system prune

# さらに徹底的に:未使用イメージも全て削除(注意!)
docker system prune -a

# ボリュームも含めて全て削除(最も徹底的、注意!)
docker system prune -a --volumes

実行前の確認:

# 削除されるイメージを確認
docker images -f "dangling=true"

# 停止中のコンテナを確認
docker ps -a --filter "status=exited"

🍺 Homebrew の棚卸し

macOSユーザーは、Homebrewのキャッシュと古いパッケージも整理しましょう。

# 古いバージョンのパッケージを削除
brew cleanup

# 未使用の依存関係を削除
brew autoremove

# Homebrewのディスク使用量を確認
brew cleanup --prune=all -n

使っていないパッケージの発見

# インストール済みパッケージの一覧
brew list

# 依存関係として自動インストールされたパッケージを表示
brew leaves

# 特定パッケージの依存関係を確認
brew deps --tree <package-name>

長期間使っていないパッケージは、brew uninstallで削除を検討しましょう。

🔐 セキュリティ棚卸し

年末は、セキュリティ関連の設定も見直す良い機会です。

セキュリティ設定の見直し

SSH鍵の棚卸し

# ~/.ssh/ 内のファイル一覧と最終更新日
ls -lht ~/.ssh/

# 各鍵ファイルの情報を確認
for key in ~/.ssh/id_*; do
    if [[ -f "$key" && ! "$key" =~ \.pub$ ]]; then
        echo "=== $(basename $key) ==="
        ssh-keygen -l -f "$key"
        echo "Last modified: $(stat -f "%Sm" "$key" 2>/dev/null || stat -c "%y" "$key")"
        echo ""
    fi
done

チェックポイント:

  • 1年以上使っていない古い鍵はないか
  • パスフレーズが設定されているか(ssh-keygen -p -f ~/.ssh/id_rsaで追加可能)
  • 不要な鍵は削除(GitHubなどからも削除)

.env ファイルの散らばり検出

機密情報を含む.envファイルが、プロジェクト外に散らばっていないか確認しましょう。

# ホームディレクトリ配下の.envファイルを検索
find ~ -name ".env" -type f 2>/dev/null | while read envfile; do
    echo "📄 Found: $envfile"
    echo "   Size: $(du -h "$envfile" | cut -f1)"
    echo "   Modified: $(stat -f "%Sm" "$envfile" 2>/dev/null || stat -c "%y" "$envfile")"
    echo ""
done

不要な.envファイルは削除し、必要なものはプロジェクトディレクトリに移動しましょう。

GnuPG鍵の期限チェックと更新

GnuPG で暗号化・署名を行っている場合、鍵の有効期限も確認しておきましょう。期限切れの鍵は使用できなくなります。

# 秘密鍵の一覧と有効期限を確認
gpg --list-secret-keys

# 出力例
# /home/user/.gnupg/pubring.kbx
# sec   rsa4096 2022-01-01 [SC] [expires: 2025-01-01]
#       1234567890ABCDEF1234567890ABCDEF12345678
# uid           [ultimate] Your Name <[email protected]>
# ssb   rsa4096 2022-01-01 [E] [expires: 2025-01-01]

有効期限が近い場合の延長方法:

# 鍵の編集モードに入る
gpg --edit-key YOUR_KEY_ID

# gpg> プロンプトで以下を実行
gpg> expire
# 新しい有効期限を設定(例:1y = 1年、2y = 2年、0 = 無期限)

# 変更を保存
gpg> save

詳細な手順は、以前の記事「GnuPG: 公開鍵の有効期限を延長する方法 」を参照してください。

チェックポイント:

  • 秘密鍵の有効期限を確認
  • 6ヶ月以内に期限切れになる鍵がないか
  • 公開鍵サーバに登録している場合は更新した鍵を再アップロード

💾 バックアップ体制の見直し

年末は、バックアップ戦略を見直す絶好の機会です。

バックアップ体制の構築

mackup: dotfilesとアプリ設定の同期

mackup は、dotfiles(.zshrc, .vimrcなど)とアプリケーション設定をクラウドストレージに同期するツールです。

インストール

# macOS
brew install mackup

# pip経由
pip install mackup

基本的な使い方

# 初回バックアップ
mackup backup

# 新しいマシンで設定を復元
mackup restore

# サポートされているアプリ一覧
mackup list

mackupは、Dropbox、Google Drive、iCloud Driveなど、主要なクラウドストレージに対応しています。設定ファイルを~/.mackup.cfgで管理します。

restic: モダンな増分バックアップ

restic は、Go製の高速バックアップツールです。重複排除、暗号化、増分バックアップに対応しています。

インストール

# macOS
brew install restic

# Ubuntu/Debian
sudo apt install restic

基本的な使い方

# リポジトリの初期化(初回のみ)
restic init --repo /path/to/backup

# バックアップの作成
restic backup ~/work --repo /path/to/backup

# バックアップ一覧の表示
restic snapshots --repo /path/to/backup

# 復元
restic restore latest --repo /path/to/backup --target ~/restore

resticは、S3、B2、SFTP、ローカルディスクなど、多様なバックエンドに対応しています。Time Machineの代替や補完として活用できます。

まとめ:年末大掃除チェックリスト

以下の項目をすべて実施して、軽快なマシンで新年を迎えましょう!

ディスク容量の奪還

  • dustでディスク使用量を確認
  • kondoでビルドアーティファクトを一括削除
  • npkillでnode_modulesを削除
  • docker system pruneでDockerクリーンアップ

パッケージマネージャーの整理

  • brew cleanupbrew autoremoveを実行
  • 使っていないHomebrewパッケージを削除

セキュリティ

  • SSH鍵の棚卸し(古い鍵の削除、パスフレーズの確認)
  • 散らばった.envファイルの整理
  • GnuPG鍵の有効期限確認と延長

バックアップ

  • mackupでdotfilesをバックアップ
  • resticで重要なプロジェクトをバックアップ
  • Time Machine(または他のバックアップ)の最終確認

前編の振り返り

  • onefetchで統計を確認(前編)
  • 未コミット・未プッシュのチェック(前編)
  • 放置ブランチの削除(前編)

お疲れさまでした!これで、あなたの開発環境は新年を迎える準備万端です。クリーンな環境で、良い年末年始をお過ごしください!🎉

参考リンク