今回は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の結果がずれるときは、削除済みで開かれたままのファイルを疑いましょう
障害対応で必ず役に立つので、ぜひマスターしてください!
