duコマンドでディレクトリ・ファイルの使用量を調べる方法|--max-depthやsortとの組み合わせも


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxコマンド > duコマンドでディレクトリ・ファイルの使用量を調べる方法|--max-depthやsortとの組み合わせも
「サーバーのディスクが逼迫しているが、どのディレクトリが容量を食っているのか分からない…」
こういう場面で真っ先に使うのが du コマンドです。

この記事では、du コマンド(disk usage)の実践的な使い方を、現場で本当に使うオプションに絞って解説します。
単に一覧を出すだけでなく、--max-depth で階層を絞る、sort と組み合わせて「容量の大きい順」に並べる、df との使い分け、容量が合わない時の原因切り分けまで、20年以上Linuxサーバーを運用してきた実務目線でまとめました。

この記事のポイント

・du -sh * で現在ディレクトリ直下の使用量を一覧表示できる
・du -h --max-depth=1 /var で階層を1段に絞って見やすくする
・du -ah / | sort -rh | head -20 で容量の大きい順トップ20を特定
・df との差が出る時はオープン中削除ファイルをlsofで探す


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

duコマンドとは?dfとの違いを押さえておく

du は disk usage の略で、指定したディレクトリやファイルが「実際にどれだけディスク容量を使っているか」を集計するコマンドです。

似たコマンドに df がありますが、役割がまったく違います。この違いを理解していないと、「df と du の結果が合わない」というトラブルで必ず詰まります。

df:ファイルシステム全体の空き容量・使用率を調べる(パーティション単位)
du:特定のディレクトリ配下が何バイト使っているかを調べる(ディレクトリ単位)

df が「パーティション全体の残量メーター」なら、du は「犯人のディレクトリ探し」に使うコマンドだと覚えてください。

本記事の動作確認は RHEL 9.4 / Ubuntu 24.04 LTS(GNU coreutils 9.x系)で実施しています。BSD版の du(macOS標準)とは一部オプションの挙動が異なる点に注意してください。

基本的な使い方(最頻出の3パターン)

duコマンドを実務で使う場面は、だいたい3パターンに集約されます。この3つさえ押さえれば、現場で困ることはほぼありません。

1. カレントディレクトリ配下のサイズを人間が読みやすい形式で表示

まずは一番シンプルな使い方です。-s(summary:合計のみ)と -h(human-readable:K/M/G単位)を組み合わせます。

# カレントディレクトリの合計サイズを表示 $ du -sh . 4.2G . # カレントディレクトリ直下の各エントリを個別に表示 $ du -sh * 512M data 2.1G logs 1.6G backup 8.0K README.md

`-s` を付けると「サマリ(合計)のみ」、付けないと配下の全サブディレクトリが再帰的に表示されます。使い分けは次の通りです。

du -sh *:直下のディレクトリ/ファイルごとに1行で表示(一番よく使う)
du -sh .:カレント全体の合計を1行だけ表示
du -h .:配下の全サブディレクトリを再帰的に表示(出力が膨大になる)

2. --max-depth で階層を絞って表示する

大きなディレクトリツリーを調べる時、再帰表示だと出力が数千行になって埋もれます。そこで便利なのが --max-depth オプションです。

# /var の直下(1階層)だけを表示 $ du -h --max-depth=1 /var 16M /var/cache 1.2G /var/log 512M /var/lib 8.0K /var/tmp 1.8G /var # 2階層まで表示(/var/log の中も見たい時) $ du -h --max-depth=2 /var/log 32M /var/log/httpd 512M /var/log/journal 680M /var/log/messages.gz 1.2G /var/log

`--max-depth=1` は「指定ディレクトリ直下まで」という意味です。障害調査の初手は --max-depth=1 から始めて、怪しいディレクトリが見つかったら数字を増やして掘り下げていくのが鉄則です。

なお、古いBSD版の du には --max-depth がなく、代わりに -d を使います。GNU版でも -d は使えるので、互換性を重視する場合は -d 1 の方が無難です。

3. sortと組み合わせて容量の大きい順に並べる

「どこが一番容量を食っているか」を一発で特定したい時は、du の出力を sort に渡します。これは現場で一番使う組み合わせです。

# /home 配下でサイズの大きい順にトップ10 $ du -ah /home | sort -rh | head -10 8.2G /home 6.1G /home/tomohiro 3.4G /home/tomohiro/backup 2.8G /home/tomohiro/backup/db_2026-04-01.sql.gz 1.2G /home/tomohiro/Downloads 980M /home/tomohiro/Downloads/rhel-9.4-x86_64-dvd.iso 512M /home/tomohiro/.cache 320M /home/tomohiro/Documents 280M /home/shared 180M /home/tomohiro/.mozilla # ディレクトリのみに絞ってトップ10(-a を外す) $ du -h /home | sort -rh | head -10

sort のオプションの意味は次の通りです。

-r:reverse(降順)
-h:human-numeric-sort。K/M/G の単位を認識して数値的に比較する

`sort -n` だと 9.8G が 10M より大きいと判定される(頭の数字しか見ない)バグが起きるので、du -h の出力には必ず -h を付けてソートしてください。

応用・実務Tips

基本の3パターン以外にも、現場で「これを知っていると早い」というTipsを紹介します。

特定の拡張子だけ合計サイズを調べる

ログファイルやバックアップファイルなど、「.gz だけで何GB使っているか」を調べたい時は find と組み合わせます。

# /var/log 配下の .gz ファイルの合計サイズ $ find /var/log -name "*.gz" -type f -print0 | du -ch --files0-from=- | tail -1 1.8G 合計 # または xargs で渡す方法(ファイル数が多い時は --files0-from=- が安全) $ find /var/log -name "*.gz" -type f | xargs du -ch | tail -1

--files0-from=- は、ファイル名に空白や特殊文字が含まれていても安全に処理できるGNU版の機能です。実務ではこちらを優先してください。

しきい値以上のディレクトリだけ表示する

--threshold(または -t)で「この容量以上のものだけ表示」というフィルタが可能です。ノイズを減らして一瞬で犯人を絞り込めます。

# 1GB以上のディレクトリだけ表示 $ du -h --max-depth=3 --threshold=1G /var 1.2G /var/log/journal 1.8G /var # 逆に「100MB未満」のものだけ見たい場合はマイナス指定 $ du -h --max-depth=2 --threshold=-100M /var

ディスク上の実使用量とファイルの見かけサイズを区別する

du はデフォルトで「ディスク上で実際に占有しているブロックサイズ」を返します。ファイルシステムのブロック単位(通常4KB)で切り上げられるため、1バイトのファイルでも 4.0K と表示されます。

見かけの論理サイズ(ls -l で見えるサイズ)を知りたい時は --apparent-size を使います。

# ディスク占有サイズ(デフォルト) $ du -sh /home/tomohiro/tiny-files/ 400K /home/tomohiro/tiny-files/ # 論理サイズ(ファイル内容のバイト数合計) $ du -sh --apparent-size /home/tomohiro/tiny-files/ 28K /home/tomohiro/tiny-files/

小さなファイルが大量にあるディレクトリ(メールスプール、セッションファイル、Gitオブジェクトなど)では、この差が10倍以上になることもあります。バックアップ容量の見積もりには --apparent-size を使う場面が多いです。

df と du の結果が合わない時の対処

現場で一番ハマりやすいトラブルです。df は「90%使用」と言うのに、du -sh / で足し上げると60%しかない——こういう時は「削除されたがオープン中のファイル」を疑ってください。

# 削除済みだがプロセスが開いているファイルを特定 $ sudo lsof +L1 | head -20 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME httpd 12345 root 5w REG 253,0 1234567890 0 1048576 /var/log/httpd/error.log.1 (deleted) mysqld 9876 mysql 12w REG 253,0 987654321 0 2097152 /var/lib/mysql/ibtmp1 (deleted)

`NLINK=0` と `(deleted)` がついているファイルは、ファイルシステム上からは消えているが、プロセスが開き続けているためにディスク領域が解放されていない状態です。該当プロセスを再起動すれば容量が解放されます。

この挙動はLinuxの「オープン中ファイルはクローズまで inode 保持」という仕様に起因するため、du と df の差は避けられません。トラブル時の定番切り分け手順として覚えておいてください。ポート番号・プロセス特定については Linux ポート確認の全コマンド も併せて参照してください。

du コマンドの主要オプション一覧

実務で使うオプションを一覧でまとめておきます。迷ったらここを見返してください。
オプション 意味・用途
-s summary。合計のみ表示(再帰表示しない)
-h human-readable。K/M/G単位で表示
-a all。ディレクトリだけでなくファイルも表示
-c 最後に総合計を1行追加する
--max-depth=N / -d N 指定した階層までしか表示しない
--threshold=SIZE / -t SIZE SIZE以上(マイナスならSIZE未満)のみ表示
--apparent-size ディスク占有ではなく論理サイズで集計
-x 別ファイルシステムをまたがない(バインドマウント対策)
--exclude=PATTERN パターンに一致するファイル/ディレクトリを除外
--time 最終更新時刻も併せて表示
-x オプションは特に重要です。/proc や /sys、bind-mountされた別ボリュームを含めると集計が歪むため、ルート直下を調べる時は du -xh --max-depth=1 / を使うのが定石です。ディスク全体の空き状況確認には mount コマンドの使い方 と組み合わせるとさらに効率が上がります。

「Permission denied」や「No such file」が出た時の対処法

du を一般ユーザーで実行すると、権限のないディレクトリで大量のエラーが出ます。典型的なのが次のような出力です。

$ du -sh /var du: '/var/cache/ldconfig' を読み込み権限がありません: 許可がありません du: '/var/lib/mysql' を読み込み権限がありません: 許可がありません du: '/var/log/audit' を読み込み権限がありません: 許可がありません 1.2G /var

権限のないディレクトリが集計から漏れているため、表示されたサイズは実際より小さくなります。根本対処は2つです。

sudo を付ける:`sudo du -sh /var` が一番確実。正確な集計が必要な時はこちら
エラーだけ捨てる:`du -sh /var 2>/dev/null` で標準エラー出力を捨てる。ただし集計は不完全になる点に注意

ログ調査目的なら sudo、ざっくり「自分が読める範囲での容量感」を知りたいだけなら 2>/dev/null という使い分けをしてください。

また「No such file or directory」が大量に出る時は、du が走っている間にファイルがローテーション・削除された可能性が高いです。稼働中のサーバーで /var/log を集計すると起きやすい現象で、通常は無視して構いません。

du でディレクトリサイズを継続監視する仕組み化

一度調べて終わりではなく、定期的に記録しておくと「いつから増え始めたか」が後から分かります。cron と組み合わせた簡単な監視スクリプトを置いておきます。

#!/bin/bash # /usr/local/bin/log-disk-usage.sh # 毎日0時に /var と /home の使用量を記録する LOGFILE="/var/log/disk-usage-history.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') { echo "===== ${DATE} =====" sudo du -sh /var /home /opt 2>/dev/null echo "" } >> "${LOGFILE}" # crontab -e で以下を追加 # 0 0 * * * /usr/local/bin/log-disk-usage.sh

1日1回の記録でも、半年後に見返すと「/var/log が先月から急激に増え始めている」という気づきが得られます。こういった自動化は make -j で並列ビルド などと同様、運用を楽にする基本テクニックです。

本記事のまとめ

du コマンドは、ディスク容量トラブルの切り分けに最初に使うツールです。df で「全体がやばい」ことを掴み、du で「どこが犯人か」を絞り込む——この二段構えを覚えておけば、ディスク逼迫の初動で迷いません。

覚えておくべきパターンは次の3つです。

du -sh *:直下のディレクトリ一覧を一気に俯瞰する
du -h --max-depth=1 /var:階層を絞ってボトルネック階層を見つける
du -ah / | sort -rh | head -20:サーバー全体でトップ20の巨大ファイル・ディレクトリを特定

オプションを無理に暗記せず、この3パターンを手に馴染ませるのが実務では一番早いです。df と du の結果が合わない時は、lsof +L1 で削除済みオープンファイルを疑う——この流れも合わせて身につけておいてください。

ディスク容量の切り分けに続いて、ファイルシステムやマウントまわりの知識も合わせて押さえておくと、障害対応のスピードが一段上がります。Linux 基本コマンドの解説もセットで確認しておくと、日常運用の引き出しが広がります。

「ディスク逼迫のたびに深夜対応で消耗していませんか?」

duコマンドは強力な調査ツールですが、本当に現場を楽にするのは「逼迫する前に気づく設計」と「障害時に迷わず動ける型」がセットで身についたときです。ディスク・ログ・プロセス・ネットワーク、どの切り口からでも自分の手で原因に辿り着けるかが現場の分かれ目になります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。