du コマンドの使い方|ディレクトリ別容量調査と大容量ファイル特定

コマンドリファレンス
  1. 結論:du コマンドはディレクトリ・ファイル個別の「ディスク実使用量」を特定する必須ツール
    1. 【最速コピペ】実務でよく使う du コマンド鉄板早見表
  2. du コマンドの基本構文と主要オプション一覧
    1. 基本構文(Syntax)
    2. 実務で必ず使う主要オプション完全比較表
    3. -h / -s / -a / -c オプションの基本動作
    4. -d(–max-depth)による探索階層の制限
  3. 【実戦】ディスク容量圧迫時のディレクトリ別調査手順(3ステップ)
    1. Step 1: df で圧迫されているパーティションを特定
    2. Step 2: du で第1階層の容量を俯瞰調査(du -h -d 1 / du -sh *)
    3. Step 3: 原因ディレクトリに潜り大容量ファイルを絞り込み
  4. 大容量ファイル・ディレクトリを特定する鉄板パイプライン&ワンライナー
    1. 容量の大きい順に並び替える(du + sort -hr + head)
    2. 指定サイズ以上のファイルだけを抽出する(find + du / –threshold)
    3. 特定の日時以降に更新されたファイルを対象にする(–time / find 連携)
  5. 現場でハマる落とし穴とプロの対処法
    1. ドットファイル(隠しファイル・ディレクトリ)を集計から漏らさない方法
    2. 別パーティションや仮想FSへの巻き込みを防ぐ(-x / –one-file-system)
    3. Permission denied の大量エラーを消去する(2>/dev/null と sudo)
    4. 見かけのサイズ(–apparent-size)と実ディスク使用量の乖離(スパースファイル)
    5. 特定の拡張子やディレクトリを除外する(–exclude)
  6. du と df の違い・使い分け完全ガイド
    1. 動作原理と特徴の比較(メタデータ参照 vs ディレクトリ走査)
    2. du と df の結果が大きくズレる原因(deleted プロセス保持問題)
  7. 実務で役立つ容量監視シェルスクリプト例
    1. 特定ディレクトリの容量肥大化を検知してログ出力するスクリプト
    2. cron で定期実行する際の注意点(nice / ionice の活用)
  8. よくある質問(FAQ)
  9. 関連記事

結論:du コマンドはディレクトリ・ファイル個別の「ディスク実使用量」を特定する必須ツール

du(Disk Usage)コマンドは、Linux/Unix環境において特定のディレクトリやファイルが実際に占有しているディスク容量(ブロックサイズ)を再帰的に走査・集計する標準コマンドです。

サーバー運用保守や障害対応において、パーティション全体の空き容量を調べる df コマンド で「ディスク使用率が100%近い」と検知した後、「具体的にどのディレクトリ配下のどのファイルが容量を食い潰しているのか」を突き止める調査フェーズで決定的な役割を果たします。

【最速コピペ】実務でよく使う du コマンド鉄板早見表

現場でディスク容量が逼迫した際、即座に実行できる代表的なコマンドラインパターンをまとめました。

やりたいこと実行コマンド実務での主な用途・解説
第1階層の容量を一覧表示du -h -d 1 /varサブディレクトリごとの合計容量をHuman-readable(K, M, G)で俯瞰
カレント配下の容量を確認du -sh *現在のディレクトリ直下のファイル・ディレクトリ容量をサマリー表示
隠しファイルも含めて確認du -sh .[!.]* *.cache.config などのドットファイル・ディレクトリを漏れなく集計
容量の大きい順にTOP10抽出du -xh / 2>/dev/null | sort -hr | head -n 10同一ファイルシステム内で容量を消費しているディレクトリTOP10を即座に特定
特定ディレクトリの総合計を表示du -sh /var/log指定したディレクトリ全体の消費サイズを1行で取得
複数対象の容量と総合計を表示du -sch /var/log /var/tmp末尾に total 行を追加して合算容量を算出
別ファイルシステムを除外して調査du -xh /NFSやマウントされた別パーティション、/proc への突入を防止
500MB以上の大容量ファイルを検索find /var -type f -size +500M -exec du -h {} +肥大化した巨大ログやダンプファイルを直接ピンポイント抽出

du コマンドの基本構文と主要オプション一覧

基本構文(Syntax)

du [オプション]... [ファイルまたはディレクトリ]...

引数を省略して du 単体で実行した場合、カレントディレクトリ配下のすべてのサブディレクトリを再帰的に走査し、1024バイトブロック単位(またはシステム既定のブロック単位)でサイズを出力します。実務では出力行数が膨大になるため、適切なオプションを付与して探索範囲や表示単位を制御するのが基本です。

実務で必ず使う主要オプション完全比較表

オプションロングオプション機能・動作詳細
-h--human-readable1024進数(KiB, MiB, GiB)で見やすい単位(K, M, G)を自動付与して表示
-s--summarize指定した引数の合計サイズのみを出力(配下の再帰詳細を非表示)
-d N--max-depth=N探索・表示するディレクトリの階層(深さ)を最大 N 階層に制限(例: -d 1
-a--allディレクトリだけでなく、すべての通常ファイルも個別に出力
-c--total出力の最終行に全体の総合計(total)行を追加
-x--one-file-system起点と異なるファイルシステム(マウントポイント、NFS、tmpfsなど)をスキップ
-k--kilobytesサイズを 1KiB(1,024バイト)ブロック単位で表示(数値比較やスクリプト用)
-m--megabytesサイズを 1MiB(1,048,576バイト)ブロック単位で表示
-b--bytes見かけのサイズをバイト単位で正確に出力(--apparent-size --block-size=1 と同等)
--apparent-size(なし)ディスク上の占有ブロック数ではなく、ファイル自体の論理データ長を表示
--exclude=PATTERN(なし)指定したパターンに一致するファイルやディレクトリを集計から除外(例: --exclude='*.tar.gz'
--threshold=SIZE(なし)指定したサイズ(例: 1G, 500M)以上の項目のみを出力(GNU coreutils限定)
--time(なし)ディレクトリまたはファイル内の最終更新日時を併せて表示

-h / -s / -a / -c オプションの基本動作

日常業務で最も頻繁に組み合わせる基本オプションの挙動の違いを理解しておきましょう。

1. -h(Human-readable表示)
デフォルトの数値はブロック数(通常1KBブロック)であるため、-h を付けることで 512M4.2G のように直感的に把握できます。

$ du -h /var/log/nginx
12M     /var/log/nginx/old
48M     /var/log/nginx

2. -s(サマリー表示)
サブディレクトリごとの出力を抑止し、指定した対象全体の合計容量のみを1行で返します。

$ du -sh /var/log/nginx
48M     /var/log/nginx

3. -a(全ファイル表示)
通常はディレクトリのみが出力対象となりますが、-a を付けるとディレクトリ内の個別ファイルもすべて出力されます。

$ du -ah /var/log/nginx
4.0K    /var/log/nginx/access.log.1.gz
36M     /var/log/nginx/access.log
12M     /var/log/nginx/error.log
48M     /var/log/nginx

4. -c(総合計行の追加)
複数の引数を渡した際、それぞれの容量を出力した上で、最後に total 行として合計を計算してくれます。

$ du -sch /var/log /var/cache
1.2G    /var/log
850M    /var/cache
2.1G    total

-d(–max-depth)による探索階層の制限

大規模なサーバーでは、ディレクトリ構造が数十階層に及ぶことがあります。階層制限なしで実行すると数万行の出力でターミナルが埋まり、ディスクI/O負荷も増大します。

探索の深さをコントロールするには -d N(または --max-depth=N)を使用します。

# 第1階層のサブディレクトリのみを容量付きで一覧表示
$ du -h -d 1 /var
1.2G    /var/log
4.5G    /var/lib
850M    /var/cache
120M    /var/backups
6.7G    /var

-d 1 を指定することで、/var/log/nginx/... などの深い階層は内部的に合算されつつ、画面には第1階層のサマリーのみがすっきりと表示されます。

【実戦】ディスク容量圧迫時のディレクトリ別調査手順(3ステップ)

アラート通知(「ディスク使用率95%超過」など)を受けた際、無駄な試行錯誤を排して最短で原因を特定する3段階のトラブルシューティング手順です。

Step 1: df で圧迫されているパーティションを特定

まずは df -h を実行し、どのマウントポイント(ファイルシステム)が圧迫されているかを確認します。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   47G  3.0G  94% /
/dev/sdb1       200G   45G  155G  23% /data
tmpfs            16G     0   16G   0% /dev/shm

上記の場合、ルートパーティション / が 94% と危険水準に達していることが分かります。

Step 2: du で第1階層の容量を俯瞰調査(du -h -d 1 / du -sh *)

対象のルート直下で -x(別ファイルシステム除外)を付けつつ第1階層の容量を調査します。

$ sudo du -xh -d 1 / 2>/dev/null | sort -hr
47G     /
32G     /var
10G     /usr
3.5G    /home
1.2G    /opt
180M    /etc

これで、47GB中32GBが /var 配下で消費されていることが瞬時に判明しました。

Step 3: 原因ディレクトリに潜り大容量ファイルを絞り込み

問題の /var ディレクトリに移動、またはパスを指定してさらに下の階層を掘り下げます。

$ sudo du -xh -d 1 /var 2>/dev/null | sort -hr
32G     /var
24G     /var/log
7.5G    /var/lib
500M    /var/cache

/var/log が24GBを消費していることが分かったため、/var/log 内のファイルをサイズ順に確認します。

$ sudo du -ah /var/log 2>/dev/null | sort -hr | head -n 10
24G     /var/log
18G     /var/log/app_debug.log
3.5G    /var/log/syslog.1
1.2G    /var/log/nginx/access.log

原因が /var/log/app_debug.log(18GB)の肥大化であると完全に特定できました。あとは適切なログローテーション設定(logrotate)や切り詰め(truncate -s 0)を実施します。

大容量ファイル・ディレクトリを特定する鉄板パイプライン&ワンライナー

容量の大きい順に並び替える(du + sort -hr + head)

du の出力を sort コマンドに渡す際、-h(Human Numeric Sort: K, M, Gの単位を考慮したソート)と -r(降順)を組み合わせるのがデファクトスタンダードです。

# カレントディレクトリ直下の容量上位15件を抽出
du -sh * 2>/dev/null | sort -hr | head -n 15

# ディレクトリ全体から最も容量の大きいディレクトリTOP20を抽出
sudo du -xh / 2>/dev/null | sort -hr | head -n 20

※ 古いUNIXや組み込みLinuxで sort -h が使えない場合は、du -k(KB単位のプレーンな数値)で出力させて sort -rn で並び替えます。

# 古い環境向けのKBソート互換パターン
du -sk * 2>/dev/null | sort -rn | head -n 10 | awk '{printf "%8.1f MBt%sn", $1/1024, $2}'

指定サイズ以上のファイルだけを抽出する(find + du / –threshold)

1. GNU du の --threshold オプション
GNU coreutils 8.21以降では、指定したサイズ未満の項目を自動で除外する --threshold オプションが使えます。

# 1GB以上のディレクトリ・ファイルのみを抽出
du -h -d 2 --threshold=1G /var 2>/dev/null

2. find コマンドと du の連携
ファイル単体で「100MB以上」「1GB以上」のものを探したい場合は、find コマンドでファイルサイズを絞り込み、du で整形して出力するのが最も高速です。

# 100MB以上の通常ファイルを検索してサイズ順に表示
find /var -type f -size +100M -exec du -h {} + 2>/dev/null | sort -hr

特定の日時以降に更新されたファイルを対象にする(–time / find 連携)

GNU du の --time オプションを使うと、ディレクトリ配下のファイルの中で「最も新しい更新日時(mtime)」を併せて表示できます。「最近急激に肥大化したディレクトリ」を見つけるのに重宝します。

$ sudo du -h -d 1 --time /var/log 2>/dev/null | sort -hr
24G     2026-08-26 16:30        /var/log
18G     2026-08-26 16:28        /var/log/app
3.5G    2026-08-25 00:00        /var/log/nginx

現場でハマる落とし穴とプロの対処法

ドットファイル(隠しファイル・ディレクトリ)を集計から漏らさない方法

エンジニアが最も頻繁に引っかかるのが、du -sh * を実行した際に .cache, .npm, .docker, .git などの隠しディレクトリが集計から完全に漏れてしまう問題です。

シェル(Bash)の標準 glob 展開 * は、先頭がドット . で始まるファイルにマッチしません。ユーザーホームディレクトリで「du -sh * で合計5GBしかないのに、なぜかディスクが40GB埋まっている」という現象の大半は、ホーム直下の隠しディレクトリ(~/.cache など)が原因です。

解決策1: 確実な glob パターンを使う(推奨)

# .[!.]* で「.」および「..」を除外した隠しファイル群にマッチさせる
du -sh .[!.]* * 2>/dev/null | sort -hr

解決策2: -d 1 でディレクトリ自身を起点にする(最も安全)

# カレントディレクトリを起点に1階層目を走査(隠しディレクトリも自動で含まれる)
du -h -d 1 . | sort -hr

別パーティションや仮想FSへの巻き込みを防ぐ(-x / –one-file-system)

ルート / から du を実行する際、-x--one-file-system)を付け忘れると大惨事になります。

  • /proc/sys などの仮想ファイルシステムを走査してカーネル情報を延々と読み込み、高負荷やI/Oストールを引き起こす
  • /mnt/media にマウントされている巨大なNFSストレージやバックアップHDDまで再帰走査してしまい、調査が終わらない
# ルートパーティション調査時は -x を絶対に付与する
sudo du -xh -d 1 / 2>/dev/null | sort -hr

Permission denied の大量エラーを消去する(2>/dev/null と sudo)

一般ユーザー権限でシステムディレクトリを走査すると、アクセス権のないディレクトリで du: cannot read directory ...: Permission denied が画面を埋め尽くし、パイプラインの sort 結果が壊れてしまいます。

# 標準エラー出力(FD 2)を /dev/null に破棄してエラーを抑制
du -sh * 2>/dev/null | sort -hr

# システム全体の調査は sudo を付与して実行
sudo du -xh -d 1 / 2>/dev/null | sort -hr

見かけのサイズ(–apparent-size)と実ディスク使用量の乖離(スパースファイル)

ls -lh で表示されるファイルサイズと、du -h で表示されるサイズが大きく食い違うことがあります。これには2つの技術的理由があります。

1. ブロック割り当て単位(4KB境界)による切り上げ
Linuxの一般的なファイルシステム(ext4 や XFS)では、データは 4KiB(4,096バイト)単位のブロックで割り当てられます。わずか 10バイト のテキストファイルであっても、ディスク上では最低 4KB のブロックを1つ消費します。小さなファイルが数十万個あるディレクトリでは、ファイル中身の合計が 10MB でも、実際のディスク消費(du)が 400MB 以上に達することがあります。

2. スパースファイル(Sparse File: 穴あきファイル)
仮想マシンのイメージ(QCOW2/RAW)やデータベースの初期化ファイル、Dockerイメージなどでは、中身がゼロの領域に実ディスクブロックを割り当てない「スパースファイル」が利用されます。

# 見かけ上のサイズ(論理データ長: 100GB)
$ du -h --apparent-size vm_disk.raw
100G    vm_disk.raw

# 実際にディスクを消費しているブロックサイズ(実使用量: 4.2GB)
$ du -h vm_disk.raw
4.2G    vm_disk.raw

ディスク逼迫調査では、「実際に消費されているブロック容量(オプションなしの通常 du)」を基準に確認してください。バックアップ転送やアーカイブ作成(tar, zstd 等)を検討する場合は --apparent-size を確認します。

特定の拡張子やディレクトリを除外する(–exclude)

調査対象外のディレクトリ(例: .gitnode_modules、キャッシュファイル等)をスキップしたい場合は、--exclude を指定します。

# .git ディレクトリと圧縮ログを除外して集計
du -h -d 2 --exclude='.git' --exclude='*.gz' /var/www

du と df の違い・使い分け完全ガイド

動作原理と特徴の比較(メタデータ参照 vs ディレクトリ走査)

dudf はどちらもディスク容量を扱うコマンドですが、内部の動作原理と取得元が根本的に異なります。

比較項目df コマンド(Disk Free)du コマンド(Disk Usage)
調査対象ファイルシステム / パーティション全体指定したディレクトリ / 個別ファイル
データの取得元ファイルシステムのスーパーブロック(メタデータ)ディレクトリツリーを再帰走査して各 inode のブロック数を合算
実行速度・負荷超高速(ミリ秒単位) / I/O負荷なし低速(ファイル数に応じてディスクI/Oが発生)
主な用途空き容量・使用率・inode残数の初動確認容量を圧迫しているディレクトリやファイルの特定
コマンド例df -h, df -idu -h -d 1 /var, du -sh *

du と df の結果が大きくズレる原因(deleted プロセス保持問題)

実務で非常によくあるトラブルに、du で計算した合計サイズは20GBなのに、df で見ると80GB使われていて空き容量が増えない」という現象があります。

この最大の原因は、「稼働中のプロセスが開きっぱなしにしている巨大ログファイルを rm で削除したこと」です。

  • du の視点: ディレクトリツリーからファイル名(エントリ)が消えているため、du は走査できず容量としてカウントしない(容量が減ったように見える)。
  • df の視点: プロセスがファイルディスクリプタ(FD)を開いているため、OSはディスクブロックを解放できず、使用中として保持され続ける。

対処法:

# 削除済みにもかかわらずプロセスが掴んでいるファイルを特定
sudo lsof +L1
# または
sudo lsof | grep '(deleted)'

# 出力例:
# nginx   12345 www-data   3u   REG  8,1  60000000000  123456 /var/log/nginx/access.log (deleted)

該当プロセス(例: Nginx)をリロードまたは再起動(sudo systemctl reload nginx)することでファイルディスクリプタが閉じられ、df 上でも即座にブロックが解放されて空き容量が復活します。

実務で役立つ容量監視シェルスクリプト例

特定ディレクトリの容量肥大化を検知してログ出力するスクリプト

du コマンドの出力をスクリプト内で判定する際は、-s(サマリー)と -m(MB単位固定)または -b(バイト単位)を使い、プレーンな整数値で比較するのが定石です。

#!/usr/bin/env bash
set -euo pipefail

# 監視対象ディレクトリと警告閾値(MB単位: 5000MB = 約5GB)
TARGET_DIR="/var/log"
THRESHOLD_MB=5000

# du -sm でディレクトリの合計サイズ(MB単位)を抽出
CURRENT_SIZE_MB=$(du -sm "${TARGET_DIR}" 2>/dev/null | awk '{print $1}')

if [[ "${CURRENT_SIZE_MB}" -ge "${THRESHOLD_MB}" ]]; then
    echo "[WARN] $(date '+%Y-%m-%d %H:%M:%S') - ${TARGET_DIR} の容量が閾値を超過しています: ${CURRENT_SIZE_MB}MB / 閾値: ${THRESHOLD_MB}MB"
    
    # 上位5つの大容量ファイルをログに出力
    echo "--- Top 5 Large Items in ${TARGET_DIR} ---"
    du -ah "${TARGET_DIR}" 2>/dev/null | sort -hr | head -n 5
else
    echo "[OK] $(date '+%Y-%m-%d %H:%M:%S') - ${TARGET_DIR} は正常範囲です: ${CURRENT_SIZE_MB}MB"
fi

cron で定期実行する際の注意点(nice / ionice の活用)

大容量ストレージに対して定期的に du を実行する場合、大量のディスクI/Oが発生して本番サービス(Webサーバーやデータベース)のレスポンスを悪化させることがあります。

cron やバッチ処理に組み込む際は、nice(CPU優先度引き下げ)および ionice(ディスクI/O優先度引き下げ)を併用するのが現場のベストプラクティスです。

# CPUとディスクI/Oの負荷をアイドル優先(Idle Priority)に下げて du を実行
ionice -c 3 nice -n 19 du -xh /var > /tmp/var_disk_usage.txt 2>/dev/null

よくある質問(FAQ)

Q: du -sh とは何ですか?何の略ですか?
A: -s--summarize: サマリー・合計のみ表示)と -h--human-readable: K, M, G 単位表示)を組み合わせたオプションです。指定したディレクトリ直下のサブディレクトリを再帰表示せず、そのディレクトリ全体の合計容量を人間が読みやすい形式(例: 2.5G)で出力します。

Q: du --max-depth-d は同じですか?
A: はい、同じ機能です。GNU coreutils の du では -d 1--max-depth=1 は全く同じ動作をします。短縮形の -d の方がターミナルで素早くタイピングできるため実務で好まれます。macOS (BSD系) の du でも -d オプションが利用可能です。

Q: du コマンドが非常に遅い・重いときの高速化テクニックは?
A: 主に以下の4つの対策が有効です。

  • -x を付けて NFS やマウントされた外部ボリューム、/proc への不要な走査を防ぐ。
  • -d 1-d 2 で走査深度を絞り、不要な出力オーバーヘッドを減らす。
  • du ではなく find . -maxdepth 2 -type d などの軽量な探索を先行させる。
  • ディスクI/Oが逼迫している場合は ionice -c 3 nice -n 19 で優先度を下げて実行する。

Q: du で表示される単位を MB や GB に固定するには?
A: 単位を固定したい場合は、-m(MB単位)または -B 1G(GB単位 / --block-size=1G)を使用します。スクリプトや集計処理で単位のブレをなくしたい場合に最適です。

# MB単位で固定表示
du -m -d 1 /var

# GB単位(1GBブロック)で固定表示
du -B 1G -d 1 /var

Q: du で Permission denied が出たときの安全な対処法は?
A: 権限不足のディレクトリを無視して良い場合は末尾に 2>/dev/null を追加してエラー出力を破棄します。システム全体の正確な容量を把握したい場合は sudo du ... で管理者権限を付与して実行してください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント