こちらからSWELLを購入できます 詳しくはこちら

【Linux】duコマンド完全ガイド ディレクトリの容量を確認する

  • URLをコピーしました!

今回はLinuxコマンドであるduコマンドについて解説します

ディレクトリやファイルが実際にどれくらいディスクを使っているかを表示するコマンドです
「ディスクがいっぱいになった!どこが原因?」という障害対応で必ず使うのでぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます

スポンサーリンク
目次

duコマンドとは??

duコマンドは、ディレクトリやファイルのディスク使用量を表示するコマンドです
名前は「Disk Usage(ディスク使用量)」の頭文字から来ています
似たコマンドにdfがありますが、dfは「ディスク(ファイルシステム)全体の空き容量」を見るコマンドです
一方duは「どのディレクトリが容量を食っているか」を調べるコマンドです
dfで「ディスクが残りわずか」と気づき、duで「原因のディレクトリ」を突き止める、という流れで使うのが定番です
この記事の実行結果は、GNU coreutils 9.4のdu(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています

duコマンドの主なオプション

duコマンドには便利なオプションがあります

オプション意味
-h (–human-readable)サイズをK・M・Gなどの単位を付けて、人間が読みやすい形で表示するオプション
-s (–summarize)指定したディレクトリの合計だけを表示するオプション
-a (–all)ディレクトリだけでなく、ファイル1つ1つのサイズも表示するオプション
-d (–max-depth)何階層下まで表示するかを指定するオプション
-c (–total)最後に合計(total)の行を追加するオプション
-x (–one-file-system)別のファイルシステム(別ディスクやNFSなどのマウント先)に入らないようにするオプション
–exclude指定したパターンに一致するファイルを集計から除外するオプション(GNU版のみ)
–apparent-size実際に使っているディスク容量ではなく、ファイルの見かけ上のサイズ(lsで見えるサイズ)を表示するオプション(GNU版のみ)

ここからは、次のコマンドで作ったテスト用ディレクトリdu-testの中で説明します
同じものを作れるので、一緒に試してみてください

事前準備(テスト用ディレクトリの作成)
mkdir△du-test△&&△cd△du-test
mkdir△-p△project/logs△project/src△project/backup
seq△-f△”2026-11-01△10:00:00△INFO△request△id=%06g△done”△1△60000△>△project/logs/app.log
seq△-f△”2026-11-01△10:00:00△ERROR△timeout△id=%06g”△1△12000△>△project/logs/error.log
printf△’print(“hello△du”)\n’△>△project/src/main.py
printf△’#△project\nduコマンドの練習用ディレクトリです\n’△>△project/README.md
head△-c△8000000△/dev/zero△>△project/backup/db.dump
# app.logは6万行、error.logは1万2千行のログ、db.dumpは8,000,000バイトのダミーファイルです

# 作成したディレクトリの構成を確認する
ls△-lR△project
実行結果:
project:
total 16
-rw-rw-r– 1 user user 61 Nov 1 12:14 README.md
drwxrwxr-x 2 user user 4096 Nov 1 12:14 backup
drwxrwxr-x 2 user user 4096 Nov 1 12:14 logs
drwxrwxr-x 2 user user 4096 Nov 1 12:14 src

project/backup:
total 7816
-rw-rw-r– 1 user user 8000000 Nov 1 12:14 db.dump

project/logs:
total 3332
-rw-rw-r– 1 user user 2880000 Nov 1 12:14 app.log
-rw-rw-r– 1 user user 528000 Nov 1 12:14 error.log

project/src:
total 4
-rw-rw-r– 1 user user 18 Nov 1 12:14 main.py

# ファイルの中身を確認する
head△-n△3△project/logs/app.log
実行結果:
2026-11-01 10:00:00 INFO request id=000001 done
2026-11-01 10:00:00 INFO request id=000002 done
2026-11-01 10:00:00 INFO request id=000003 done
head△-n△3△project/logs/error.log
実行結果:
2026-11-01 10:00:00 ERROR timeout id=000001
2026-11-01 10:00:00 ERROR timeout id=000002
2026-11-01 10:00:00 ERROR timeout id=000003
cat△project/src/main.py
実行結果:
print(“hello du”)
cat△project/README.md
実行結果:
# project
duコマンドの練習用ディレクトリです

以降のコマンドは、すべてdu-testの中で実行します
日時の部分は、実行した日時によって変わります

-h (–human-readable)

サイズをK・M・Gなどの単位を付けて、人間が読みやすい形で表示するオプション
付けないとKB単位の数字だけが表示されるので、普段はほぼ必ず付けて使います

コマンド実行例
du△project
実行結果:
8 project/src
3336 project/logs
7820 project/backup
11172 project
du△-h△project
実行結果:
8.0K project/src
3.3M project/logs
7.7M project/backup
11M project

-s (–summarize)

指定したディレクトリの合計だけを表示するオプション
サブディレクトリの内訳はいらず「全体で何GBか」だけ知りたいときに使います

コマンド実行例
du△-sh△project
実行結果:
11M project

-a (–all)

ディレクトリだけでなく、ファイル1つ1つのサイズも表示するオプション
どのファイルが大きいのかまで知りたいときに使います

コマンド実行例
du△-ah△project
実行結果:
4.0K project/src/main.py
8.0K project/src
4.0K project/README.md
516K project/logs/error.log
2.8M project/logs/app.log
3.3M project/logs
7.7M project/backup/db.dump
7.7M project/backup
11M project

-d (–max-depth)

何階層下まで表示するかを指定するオプション
-d 1なら「指定したディレクトリの直下」だけを表示するので、深い階層まで大量に表示されるのを防げます

コマンド実行例
du△-h△-d△1△project
実行結果:
8.0K project/src
3.3M project/logs
7.7M project/backup
11M project
# –max-depth=1と書いても同じ意味です

-c (–total)

最後に合計(total)の行を追加するオプション
複数のファイルやディレクトリを指定して、まとめていくつになるかを知りたいときに便利です

コマンド実行例
du△-ch△project/logs/*.log
実行結果:
2.8M project/logs/app.log
516K project/logs/error.log
3.3M total

-x (–one-file-system)

別のファイルシステム(別ディスクやNFSなどのマウント先)に入らないようにするオプション
/のように上位のディレクトリから調べるとき、マウントされた別ディスクまで数えてしまうのを防げます

コマンド実行例
sudo△du△-xh△-d△1△/
# /と同じファイルシステムにあるディレクトリだけを集計します
# NFSなどの遅いマウント先を読みにいかないので、調査が早く終わることも多いです
# 結果は環境によってまったく違うので、ここでは省略しています

–exclude

指定したパターンに一致するファイルを集計から除外するオプション(GNU版のみ)
パターンはシェルのワイルドカードと同じ書き方で、クォートで囲んでおきます

コマンド実行例
du△-sh△–exclude=’*.dump’△project
実行結果:
3.3M project
# 7.7MのDBダンプを除いた合計が表示されます

–apparent-size

実際に使っているディスク容量ではなく、ファイルの見かけ上のサイズ(lsで見えるサイズ)を表示するオプション(GNU版のみ)
-bを付けると、見かけ上のサイズをバイト単位で表示します(–apparent-size –block-size=1と同じ)

コマンド実行例
du△-h△project/README.md
実行結果:
4.0K project/README.md
du△-b△project/README.md
実行結果:
61 project/README.md

61バイトのファイルなのに4.0Kと表示されるのは、ディスクが4KB単位(ブロック単位)で領域を確保しているためです
「duとlsでサイズが違う」理由は、後ほどトラブルシューティングで詳しく解説します

基本的な使い方

duコマンドの基本的な構文は「du△オプション△ディレクトリ名(ファイル名)」となります
ディレクトリ名を省略すると、今いるディレクトリ(カレントディレクトリ)が対象になります
オプションなしだと配下のすべてのディレクトリが表示されるので、まずは-shか-h -d 1を覚えておけば十分です

コマンド実行例
du△-sh△project
ディレクトリ全体の合計を表示
du△-h△-d△1△project
直下のディレクトリごとの内訳を表示
du△-sh△project/logs△project/src
実行結果:
3.3M project/logs
8.0K project/src
# 複数のディレクトリをまとめて指定することもできます

sortと組み合わせて大きい順に並べる

duの結果はサイズ順ではなく、ディレクトリを読んだ順に表示されます
そこでsortコマンドと組み合わせて、大きい順に並べ替えるのが定番の使い方です

大きい順に並べる例
# 直下のディレクトリを大きい順に並べる
du△-h△-d△1△project△|△sort△-rh
実行結果:
11M project
7.7M project/backup
3.3M project/logs
8.0K project/src

# ファイルも含めて大きいものトップ5を表示する
du△-ah△project△|△sort△-rh△|△head△-n△5
実行結果:
11M project
7.7M project/backup/db.dump
7.7M project/backup
3.3M project/logs
2.8M project/logs/app.log

ポイントはsortの-hです
-hは「11M」「7.7M」「8.0K」のような単位付きの数字を正しく比較してくれるオプションで、-rは逆順(大きい順)の指定です
-hを付けずに数字だけで並べると「8.0K」が「7.7M」より大きいと判定されてしまうので注意しましょう
なお、sortの-hはGNU版のsortで使えるオプションです

隠しファイルも含めて集計する

ホームディレクトリで「du -sh *」を実行すると、.cacheのようにドットで始まる隠しファイル・隠しディレクトリが集計から漏れてしまいます
これはduではなく、シェルの*が隠しファイルに一致しないためです

隠しファイルの集計例
# 事前準備:ホームディレクトリに見立てたhome-sampleを作る
mkdir△home-sample△&&△cd△home-sample
mkdir△.cache
head△-c△2000000△/dev/zero△>△.cache/big.bin
echo△memo△>△note.txt
ls△-la
実行結果:
total 16
drwxrwxr-x 3 user user 4096 Nov 1 12:14 .
drwxrwxr-x 4 user user 4096 Nov 1 12:14 ..
drwxrwxr-x 2 user user 4096 Nov 1 12:14 .cache
-rw-rw-r– 1 user user 5 Nov 1 12:14 note.txt
ls△-la△.cache
実行結果:
total 1964
drwxrwxr-x 2 user user 4096 Nov 1 12:14 .
drwxrwxr-x 3 user user 4096 Nov 1 12:14 ..
-rw-rw-r– 1 user user 2000000 Nov 1 12:14 big.bin

# 隠しディレクトリ(2MBの.cache)が表示されない
du△-sh△*
実行結果:
4.0K note.txt

# .[!.]*を追加すると隠しディレクトリも表示される
du△-sh△.[!.]*△*
実行結果:
2.0M .cache
4.0K note.txt

# 隠しディレクトリも含めた直下の内訳なら、こちらでもOK
du△-h△-d△1△.
実行結果:
2.0M ./.cache
2.0M .
# 最後の行はhome-sample全体の合計です

# du-testに戻る
cd△..

.[!.]*は「ドットで始まり、2文字目がドットではないもの」という意味で、.(カレント)と..(親ディレクトリ)を除外するための書き方です
「ホームの合計は大きいのに、du -sh *の合計が全然足りない」というときは、隠しディレクトリを疑ってみてください

duコマンドの実用的な活用例

実際の現場で「ディスク使用率が90%を超えた」というアラートが来たときの調査手順をご紹介します

ディスク逼迫時の調査手順
# 1. dfでどのファイルシステムがいっぱいか確認する
df△-h

# 2. そのファイルシステムの直下で、大きいディレクトリを探す
sudo△du△-xh△-d△1△/△2>/dev/null△|△sort△-rh△|△head△-n△10

# 3. 大きかったディレクトリ(例:/var)にもう1階層もぐる
sudo△du△-xh△-d△1△/var△2>/dev/null△|△sort△-rh△|△head△-n△10

# 4. ログディレクトリの中身をファイル単位で確認する
sudo△du△-sh△/var/log/*△|△sort△-rh△|△head△-n△5
# これを繰り返して、容量を食っているファイルまでたどり着きます
# 結果はサーバーごとに違うので、ここでは省略しています

いきなり「du -ah /」を実行すると、全ファイルを表示するので時間がかかるうえ、画面も大量に流れてしまいます
-d 1で1階層ずつもぐっていくのが、早く確実に原因を見つけるコツです
原因のファイルが見つかっても、すぐに削除するのは危険です
※ログやDBのファイルを消す前に、アプリケーションが使用中でないか・本当に不要かを必ず確認してください

そのほかの活用例
# 複数のユーザーのホームディレクトリの使用量を一覧にする
sudo△du△-sh△/home/*△|△sort△-rh

# 拡張子.logのファイルの合計だけを表示する
du△-ch△project/logs/*.log△|△tail△-n△1
実行結果:
3.3M total

# 1MB以上のものだけを表示する(GNU版のみ)
du△-ah△-t△1M△project
実行結果:
2.8M project/logs/app.log
3.3M project/logs
7.7M project/backup/db.dump
7.7M project/backup
11M project

# 最終更新日時も一緒に表示する(GNU版のみ)
du△-sh△–time△project/logs
実行結果:
3.3M 2026-11-01 12:14 project/logs

トラブルシューティング

duコマンド使用時によくある問題と解決法です

Permission deniedがたくさん表示される

一般ユーザーで実行すると、読む権限のないディレクトリでエラーが表示されます
エラーになったディレクトリは集計に含まれないので、表示される合計は実際より小さくなります

権限エラーの例
# 事前準備:rootしか読めないディレクトリsecretを作る
mkdir△-p△permtest/open
echo△hello△>△permtest/open/a.txt
sudo△mkdir△permtest/secret
sudo△cp△project/backup/db.dump△permtest/secret/
sudo△chmod△700△permtest/secret
ls△-l△permtest
実行結果:
total 8
drwxrwxr-x 2 user user 4096 Nov 1 12:14 open
drwx—— 2 root root 4096 Nov 1 12:14 secret

# 一般ユーザーで実行する
du△-sh△permtest
実行結果:
du: cannot read directory ‘permtest/secret’: Permission denied
16K permtest

# エラーを捨てて結果だけを見る
du△-sh△permtest△2>/dev/null
実行結果:
16K permtest

# 正確に集計したいときはsudoを付ける
sudo△du△-sh△permtest
実行結果:
7.7M permtest
# secretの中の7.7Mのファイルも数えられています

2>/dev/nullはエラーを見えなくするだけで、集計漏れは解消されない点に注意しましょう
上の例でも、一般ユーザーでは16K、sudoを付けると7.7Mと、結果が大きく違います
システム全体を調べるときはsudoを付けて実行するのが基本です

dfは使用率が高いのに、duで探しても大きいファイルが見つからない

障害対応でとてもよくあるのがこのパターンです
原因で多いのは「削除したのに、プロセスがまだ開いているファイル」です
rmでファイルを消しても、そのファイルを開いているプロセスが動いている間は、ディスク上の領域は解放されません
duはディレクトリからたどれるファイルしか数えないので、削除済みのファイルは集計に出てこず、dfとduの結果がずれてしまいます

削除済みで開かれたままのファイルを探す
# 事前準備:48MBのbig.logをtailで開いたまま削除する
head△-c△50000000△/dev/zero△>△big.log
du△-sh△big.log
実行結果:
48M big.log
tail△-f△big.log△>△/dev/null△2>&1△&
# tailをバックグラウンドで動かして、big.logを開いたままにします(メッセージは捨てています)
rm△big.log
ls△big.log
実行結果:
ls: cannot access ‘big.log’: No such file or directory
# ファイルは見えなくなりましたが、48MBの領域はまだ解放されていません

# リンク数0(=削除済み)なのに開かれているファイルを一覧表示する
lsof△+L1
実行結果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
tail 1178 user 3r REG 254,0 50000000 0 795163 /home/user/du-test/big.log (deleted)
# NAME列の末尾の(deleted)が目印です
# 他のユーザーのプロセスも調べるときはsudo△lsof△+L1で実行します

# ファイルを開いているプロセスを止めると領域が解放される
kill△%1
lsof△+L1
# 何も表示されなくなれば解放済みです

# サービスの場合は再起動する(例:rsyslog)
sudo△systemctl△restart△rsyslog

lsofが入っていない環境では、先にパッケージのインストールが必要です
どのサービスを再起動すればよいかは、lsofの結果に表示されるCOMMAND列(プロセス名)とPID列で確認できます
PIDやDEVICE、NODEの値は環境によって変わります
本番環境のサービスを再起動するときは、影響範囲を確認してから実施してください
また、使用中のログを空にしたいときは、rmで消すのではなく「: > ファイル名」のようにリダイレクトで中身を空にすると、プロセスを止めずに領域を解放できます

lsで見たサイズとduのサイズが違う

lsが表示するのは「ファイルの見かけ上のサイズ」、duが表示するのは「実際に確保しているディスク容量」です
小さなファイルはブロック単位(多くの環境で4KB)で確保されるため、duの方が大きく表示されます
逆に、中身の大部分がまだ書き込まれていない「スパースファイル」(仮想マシンのディスクイメージなど)では、duの方がずっと小さく表示されます

スパースファイルの例
truncate△-s△100M△sparse.img
# 見かけ上100MBのからっぽのファイルを作成
ls△-lh△sparse.img
実行結果:
-rw-rw-r– 1 user user 100M Nov 1 12:14 sparse.img
du△-h△sparse.img
実行結果:
0 sparse.img
du△-h△–apparent-size△sparse.img
実行結果:
100M sparse.img

「ディスクの空きを知りたい」ときは通常のdu、「ファイルを転送・コピーしたらどれくらいになるか」を知りたいときは–apparent-sizeを使うと覚えておきましょう

シンボリックリンクの先が集計されない

duは初期設定ではシンボリックリンクをたどらず、リンクそのもののサイズだけを数えます
リンク先の中身まで集計したいときは-Lを付けます

シンボリックリンクの集計例
# 事前準備:projectへのシンボリックリンクを作る
mkdir△linktest
ln△-s△../project△linktest/plink
ls△-l△linktest
実行結果:
total 0
lrwxrwxrwx 1 user user 10 Nov 1 12:14 plink -> ../project

du△-sh△linktest
実行結果:
4.0K linktest
du△-shL△linktest
実行結果:
11M linktest

-Lを付けると同じデータを二重に数えてしまうこともあるので、ディスク使用量の調査では基本的に付けずに使うのがおすすめです

まとめ

いかがでしたでしょうか
今回はduコマンドについてまとめてみました
duはディレクトリやファイルのディスク使用量を表示するコマンドで、-shで合計、-h -d 1で直下の内訳を確認できます
「du -h -d 1 | sort -rh」で大きい順に並べ、1階層ずつもぐっていくのがディスク逼迫調査の基本です
dfとduの結果がずれるときは、削除済みで開かれたままのファイルを疑いましょう
障害対応で必ず役に立つので、ぜひマスターしてください!

スポンサーリンク

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!