Linux / コマンド / du - ファイルとディレクトリの容量確認

duは、指定したファイルとディレクトリがファイルシステムで使用するスペースを計算して表示するコマンドです。現在のディレクトリの直下のディレクトリ別の使用量と全体の合計を人間が読みやすい単位で確認するにはdu -h --max-depth=1 .を、合計のみを確認するにはdu -sh .を使用します。

du -h --max-depth=1 .
du -sh .

duのデフォルトは、ファイル内容の見かけのサイズではなく、ファイルシステムで実際に割り当てられたブロックを基準としています。スパースファイル、圧縮ファイルシステム、ハードリンク、コピーオンライト環境では、他のツールの数値と差が出る場合があります。

duコマンドは何を計算しますか?

duはdisk usageの略で、ファイルとディレクトリのツリーを巡回してディスク使用量を合計します。ファイル内容だけでなく、ファイルシステムのブロック割り当て方式の影響を受けるため、ls -lが表示するファイルサイズと常に一致するわけではありません。

オプションや計算上の制限は、GNU Coreutils du公式ドキュメントで確認できます。

最もよく使用する基本コマンド

現在のディレクトリ全体のサイズ確認

du -sh .

-sは合計のみ、-hはKiB・MiB・GiBのように読みやすい単位で表示します。隠しファイルと隠しディレクトリも現在のディレクトリの合計に含まれます。

直下のディレクトリ別の使用量を確認

du -h --max-depth=1 .

--max-depth=1は開始地点から一段下のディレクトリまで集計結果を表示します。通常ファイルも個別に表示するには-aを組み合わせます。これは表示する深さの制限であり、合計の計算に必要な下位ディレクトリの探索を打ち切る指定ではありません。GNU duでは短く-d 1と書くこともできますが、他のUnix系ではサポートされるかどうかは異なる場合があります。

大きな項目を並べて探す

du -h --max-depth=1 /var | sort -h

sort -hは人が読みやすい単位を考慮して並べ替えます。大きな項目を上に表示するにはsort -hrを使用します。

du -h --max-depth=1 /var | sort -hr

権限のないディレクトリではエラーが発生し、合計が不完全になることがあります。必要な範囲にのみ適切な権限で実行し、単にエラーを隠して結果を完全な値のように解釈しないでください。

主なオプションまとめ

オプション 機能 使用例
-h 読みやすい単位で表示 du -h /var/log
-s 各引数の合計のみ表示 du -sh /var/log
-a ディレクトリだけでなくファイルも表示 du -ah ./data
-c 最後に全体の合計を追加 du -ch file1 file2
-d N 表示する最大ディレクトリの深さを指定 du -h -d 2 .
-x 他のファイルシステムに移動しない du -xhd1 /
--exclude パターンに一致するパスを除外 du -sh --exclude='*.log' .
--apparent-size 割り当て量の代わりに見かけのサイズを表示 du -sh --apparent-size file

ファイルとディレクトリを細かく検索

すべてのファイルまで表示する

du -ah ./data | sort -hr | head -n 20

小さいディレクトリで上位項目を素早く見つけるのに便利です。大規模なファイルシステムではすべてのパスを巡回してソートするため、ディスクI/Oやメモリを多く使用する可能性があります。

最小サイズ以上の項目のみ表示する

du -h --threshold=1G ./data

GNU duの--thresholdは指定サイズ以上の項目のみを出力します。ディストリビューションや他のUnix実装ではサポートされない場合があるため、移植性が必要な場合はdu --helpを確認してください。

特定のファイルやディレクトリを除外する

du -sh --exclude='*.log' --exclude='cache' .

--excludeのパターンはシェルが先に展開しないように、シングルクォートで囲むことが安全です。除外ルールが多い場合は、一行に一つずつ書いたファイルを作成し、--exclude-fromを使用できます。

du -sh --exclude-from=du-exclude.txt .

実際の使用量と見かけ上のサイズの違い

基本ディスク使用量

基本duは、ファイルシステムがファイルに割り当てたブロックを合計します。非常に小さなファイルでも最小ブロックサイズ分のスペースを使用することがあり、ファイルのメタデータやファイルシステム内部構造は結果に完全には反映されない場合があります。

見かけのサイズ

--apparent-sizeは、通常のファイルであればファイル内容の論理長に近い値を示します。

du -h sample.img
du -h --apparent-size sample.img

スパースファイルは、論理サイズが非常に大きくても実際のブロックをほとんど使用しない場合があります。逆に、ファイルシステムの圧縮、重複除去、スナップショット、コピーオンライトの共有ブロックがある環境では、基本duも物理装置の実際の消費量と異なるように見えることがあります。

ハードリンク

複数のパスが同じinodeを指すハードリンクの場合、GNU duは基本的に同じファイルのスペースを一度だけ数えます。複数の引数を渡す順序によって、どのパスに使用量が帰属するかが変わることがあります。--count-links(-l)で各リンクを個別に計算すると、合計が実際のユニークブロックより大きくなることがあります。

ファイルシステムの境界を制限する

別のファイルシステムへの探索を制限する

ルートファイルシステムを調査するとき、-xまたは--one-file-systemを使用すると、他のファイルシステムには降りていきません。

du -xhd1 /

このオプションは、ネットワークファイルシステム、別のデータボリューム、仮想ファイルシステムを意図せず巡回することを減らします。異なるファイルシステム上にある下位マウントの内容は集計されないため、調査目的に合っているか確認してください。bind mountのように別のマウントでも同一ファイルシステムの場合があるので、すべてのマウント境界を除外する指定とは考えません。

シンボリックリンクの処理

duは、基本的にシンボリックリンクの参照先をたどらず、リンク自体が使う領域を扱います。リンクをたどるオプションは他のディレクトリやファイルシステムを大量に巡回する可能性があるため、対象構造を確認してから使用してください。

duとdfの結果が異なる理由

計算対象が違います

duはアクセス可能なディレクトリツリーのファイルを合算しますが、dfはファイルシステム全体のブロック使用状況を報告します。ファイルシステムメタデータ、予約ブロック、スナップショット、権限によって読めないパスなどにより、差異が生じることがあります。

削除されたが開かれているファイル

プロセスがファイルを開いたままパスだけが削除されると、duはそのファイルを見つけられませんが、プロセスがファイルを閉じるまでブロックは解放されないため、dfには引き続き使用中と表示されます。lsofがインストールされており、必要な参照権限がある場合は、次のように削除済みで開かれたファイルを確認できます。一般ユーザーの出力だけでは、他のユーザーのプロセスをすべて確認できないことがあります。

lsof +L1

対象プロセスを無条件に強制終了せず、サービスの正常な再起動・ログの再オープン手順を確認してください。削除されたファイルのファイルディスクリプターを任意に操作すると、データ損失やサービス障害が発生する可能性があります。

安全で正確に使用する方法

  • まず、df -hで満たされたファイルシステムを確認した後、該当のマウントポイント内でduを実行します。
  • ルートで調査する場合は、-xで他のファイルシステムを除外するかを決定します。
  • 大規模ディレクトリでは、業務負荷の低い時間に対象ディレクトリを絞って段階的に調査します。表示深さの制限だけで探索量が減るとは考えません。
  • 権限エラーがある場合は、結果が不完全である事実を記録し、必要最低限の権限のみを使用します。
  • ファイルを削除する前に、所有プロセス、バックアップ、保管ポリシー、および復旧可能かどうかを確認します。
  • ファイル名には改行などの特殊文字が含まれる可能性があるため、自動化ではNUL区切りオプションをサポートするツールの組み合わせを検討します。

よくある質問

隠しファイルも du の結果に含まれますか?

du -sh . のようにディレクトリ自体を指定すると隠しファイルも合計に含まれます。しかしシェルの * は基本的に隠し項目とは一致しないため、du -sh * の結果には含まれないことがあります。

最も大きいディレクトリだけを素早く見つけるにはどうすればいいですか?

du -h --max-depth=1 対象 | sort -hr で一歩ずつ確認してください。出力量とソートの負荷は抑えられますが、配下の集計に必要な探索は行われます。出力には開始ディレクトリ自身の合計も含まれるため、子ディレクトリの値と区別してください。階層ごとの表示行を全部足すと二重計上になります。

du -sh と ls -lh のサイズが異なる理由は何ですか?

ls -lh は主にファイルの論理的な長さを、基本 du は割り当てられたファイルシステムのブロックを表示します。スパースファイルや小さいファイル、ブロックサイズのために差が出ることがあります。

Permission denied エラーを隠してもいいですか?

画面を簡潔にすることはできますが、結果が不完全である事実も消えてしまいます。容量調査ではまずエラーが出たパスを確認し、権限が必要な理由と範囲を検討する方が安全です。

まとめ

du -sh パスは合計を、du -h --max-depth=1 パスは直下の項目ごとの使用量を表示します。大きな項目を見つけるときはsort -hrと組み合わせ、他のファイルシステムを除外するには-xを使用してください。

duの値は、ファイルシステムの構造と割り当て方式の影響を受ける推定値です。dfと差がある場合は、削除された開いたファイル、予約ブロック、スナップショット、そして権限の問題まで確認する必要があります。