- Linux
Linux duコマンドの使い方 容量を大きい順に調べる定番ワンライナー集
duコマンドとは、ファイルやディレクトリが使っているディスク容量を集計して表示するLinuxの標準コマンドです。 「ディスクがいっぱいになってきた。どのディレクトリが大きいのか」を調べるときは、du -sh * | sort -rh で直下を大きい順に並べるのが定番です。
この記事では、Ubuntu 24.04(GNU coreutils 9.4)で実際に動かした結果をもとに、目的別のワンライナーを逆引き表にまとめました。さらに「du の合計と df の使用量が合わない」という定番の疑問について、削除済みで開かれたままのファイル、予約ブロック、スパースファイル、マウントポイントの下に隠れたファイルを、小さなテスト用ファイルシステムの上で1つずつ再現しています。macOS(BSD版)とのオプション差、ncdu・find との使い分けも表で確認できます。
duコマンドの早見表
| やりたいこと | コマンド |
|---|---|
| このディレクトリの合計 | du -sh . |
| 直下を大きい順に並べる | du -sh * | sort -rh |
| 隠しディレクトリも含めて大きい順 | du -h -d 1 . | sort -rh |
| 上位10件だけ | du -h -d 1 . | sort -rh | head -n 10 |
| ファイル単位も含めて上位10件 | du -ah . | sort -rh | head -n 10 |
| 2階層下まで | du -h -d 2 . | sort -rh |
| 特定の拡張子を除外して集計 | du -sh --exclude="*.log" app |
| 複数ディレクトリの総計 | du -shc app data |
| 別ファイルシステムを跨がない | du -shx / |
| 10MB以上のものだけ | du -h -t 10M -a . | sort -rh |
| 見かけのサイズ(中身のバイト数) | du -sh --apparent-size . |
| ファイル数(iノード数)を数える | du --inodes -d 1 . | sort -rn |
| 権限エラーを表示しない | du -h -d 1 /var 2>/dev/null | sort -rh |
-s は合計だけ、-h は読みやすい単位、-d N は深さ、sort -rh は「単位つきの数字を大きい順」です。この4つを覚えると、ほとんどの調査に対応できます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux duコマンドの使い方 容量を大きい順に調べる定番ワンライナー集」
検証環境とテスト用ディレクトリ
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04.4 LTS |
| du / sort / df | GNU coreutils 9.4 |
| ファイルシステム | ext4(ブロックサイズ 4KiB)、tmpfs |
| 関連ツール | ncdu 1.19、lsof、tune2fs(e2fsprogs) |
次のコマンドで、記事と同じ構成のテスト用ディレクトリを作れます。合計で約110MBを使うので、空きのある場所で試してください。
mkdir -p demo && cd demo
mkdir -p app/logs app/cache app/src data/images data/backup .hidden
head -c 30M /dev/urandom > app/logs/app.log
head -c 12M /dev/urandom > app/logs/access.log
head -c 5M /dev/urandom > app/cache/tmp.bin
head -c 200K /dev/urandom > app/src/main.py
head -c 48M /dev/urandom > data/backup/dump.sql.gz
head -c 8M /dev/urandom > data/images/a.png
head -c 3M /dev/urandom > data/images/b.png
head -c 2M /dev/urandom > .hidden/secret.dat
head -c 1500 /dev/urandom > README.md
duの基本:-s、-h、-d の3つ
オプションなしの du は、すべてのサブディレクトリを1KiB単位で表示します。行数が多くなるので、ふだんは次の3つを組み合わせます。
| オプション | 意味 | 補足 |
|---|---|---|
| -s(--summarize) | 引数ごとの合計だけを表示 | -d 0 と同じ |
| -h(--human-readable) | K・M・G の単位で表示 | 1K=1024。1000単位にするなら --si |
| -d N(--max-depth=N) | N階層下まで表示 | -d 1 が「直下まで」 |
| -a(--all) | ファイルも1行ずつ表示 | 既定はディレクトリだけ |
| -c(--total) | 最後に総計の行を追加 | 複数の引数を合算したいとき |
| -x(--one-file-system) | 別のファイルシステムを集計しない | / を調べるときに便利 |
| -k / -m | KiB / MiB 単位の整数で表示 | スクリプトで数値比較するとき |
合計だけを見る
du -sh .
109M .
直下の内訳を見る
du -sh *
4.0K README.md
48M app
60M data
* はシェルが名前の一覧に展開します。このとき ドットで始まる名前(.hidden)は対象に入りません。合計は 109M なのに、表示された3行を足しても 108M ほどにしかならないのはそのためです。隠しディレクトリも含めたいときは、次の -d 1 を使います。
du -h -d 1 .
-d 1 は du 自身がディレクトリをたどるので、.hidden も含まれます(実行結果は次の節に載せます)。GNU版では --max-depth=1 と書いても同じです。
du -h --max-depth=1 app
204K app/src
5.1M app/cache
43M app/logs
48M app
目的別ワンライナー逆引き(実行結果つき)
直下を大きい順に並べる
du -sh * | sort -rh
60M data
48M app
4.0K README.md
sort -h は「4.0K、48M、1.2G」のような単位つきの数字を正しく比べるオプションです。-r で降順(大きい順)になります。sort -rn(単純な数値の比較)を -h つきの出力に使うと、60M より 4.0K… ではなく「数字の部分だけ」で比べられてしまうので、次のどちらかの組み合わせにそろえます。
| 組み合わせ | 例 | 向いている用途 |
|---|---|---|
| du -h と sort -rh | du -sh * | sort -rh | 目で見て確認する |
| du -k と sort -rn | du -sk * | sort -rn | スクリプトで数値として扱う |
du -sk * | sort -rn | head -n 3
60428 data
48344 app
4 README.md
隠しディレクトリも含めて大きい順
du -h -d 1 . | sort -rh
109M .
60M ./data
48M ./app
2.1M ./.hidden
1行目に全体の合計(.)が入るのが、この書き方の特徴です。直下のファイル(README.md)は -d 1 だけでは行として出ません(合計には含まれます)。ファイルも並べたいときは -a を足します。
シェルの展開で隠しファイルを含める書き方もあります。
du -sh .[!.]* * | sort -rh
60M data
48M app
2.1M .hidden
4.0K README.md
上位N件だけ表示する
du -ah . | sort -rh | head -n 5
109M .
60M ./data
49M ./data/backup
48M ./data/backup/dump.sql.gz
48M ./app
-a を付けるとファイルも対象になるので、「どのファイルが大きいか」まで一度にわかります。上位10件なら head -n 10 にします。ディレクトリだけに絞るなら -a を外します。
du -h -d 2 . | sort -rh | head -n 6
109M .
60M ./data
49M ./data/backup
48M ./app
43M ./app/logs
12M ./data/images
特定の拡張子・パターンを除外する
du -sh --exclude="*.log" app
5.3M app
app は全体で 48M でしたが、ログを除くと 5.3M です。ログ以外にどれだけ使っているかを知りたいときに使えます。--exclude は複数回指定できます。
du -ch --exclude="*.png" --exclude="*.gz" data | tail -n 1
12K total
パターンはシェルに展開されないよう引用符で囲みます。
特定の拡張子だけを合計する
du -ch data/images/*.png | tail -n 1
11M total
サブディレクトリも含めて集めたいときは find と組み合わせます(後の節を参照)。
複数のディレクトリを合算する
du -shc app data | tail -n 1
107M total
別ファイルシステムを跨がない(-x)
/ 以下を調べるときに -x を付けないと、/proc や別ディスクのマウント先まで集計してしまいます。テスト用に demo/mounted へ tmpfs をマウントし、20MBのファイルを置いて比べました(マウントには管理者権限が必要です)。
mkdir -p demo/mounted
mount -t tmpfs -o size=64M tmpfs demo/mounted
head -c 20M /dev/urandom > demo/mounted/x.bin
du -sh demo
du -shx demo
129M demo
109M demo
-x を付けると、マウントされた別ファイルシステムの 20M が除かれて 109M になりました。 ルートの調査では、次の形が定番です。
du -h -x -d 1 / 2>/dev/null | sort -rh | head -n 10
一定サイズ以上だけ表示する
du -h -t 10M -a . | sort -rh
109M .
60M ./data
49M ./data/backup
48M ./data/backup/dump.sql.gz
48M ./app
43M ./app/logs
30M ./app/logs/app.log
12M ./data/images
12M ./app/logs/access.log
-t(--threshold)は、指定サイズ以上のものだけを表示します。負の値(-t -1M)にすると「指定サイズ以下」になります。
サブディレクトリを含めない「そのディレクトリ直下だけ」の量
du -S -h . | sort -rh | head -n 4
49M ./data/backup
43M ./app/logs
12M ./data/images
5.1M ./app/cache
-S(--separate-dirs)は、サブディレクトリの分を親に足しません。「実際にファイルが置かれている場所」がそのまま上位に来るので、深い階層の中から置き場所を特定しやすくなります。
最終更新時刻も一緒に表示する
du -h --time -d 1 . | sort -rh | head -n 3
109M 2026-10-03 13:37 .
60M 2026-10-03 13:37 ./data
48M 2026-10-03 13:36 ./app
--time は、その中で最も新しい更新時刻を表示します。「大きくて、しかも最近も増えている」ディレクトリを探すときの手がかりになります。
ファイル数(iノード)を数える
du --inodes -d 1 . | sort -rn | head -n 3
18 .
8 ./app
6 ./data
容量は空いているのに書き込めないときは、iノード(ファイル1個につき1つ使う管理番号)が足りないことがあります。df -i で使用率を見て、du --inodes で多い場所を探します。
逆引き一覧
| 目的 | ワンライナー | 今回の結果(先頭行) |
|---|---|---|
| 全体の合計 | du -sh . | 109M |
| 直下を大きい順 | du -sh * | sort -rh | 60M data |
| 隠しも含めて直下 | du -h -d 1 . | sort -rh | 109M . |
| ファイル込みで上位5件 | du -ah . | sort -rh | head -n 5 | 109M . |
| ログを除外 | du -sh --exclude="*.log" app | 5.3M app |
| png だけ合計 | du -ch data/images/*.png | tail -n 1 | 11M total |
| 2つを合算 | du -shc app data | tail -n 1 | 107M total |
| 別FSを除く | du -shx demo | 109M demo |
| 10M以上だけ | du -h -t 10M -a . | sort -rh | 109M . |
| 直下の分だけで比較 | du -S -h . | sort -rh | 49M ./data/backup |
| KiBの数値で比較 | du -sk * | sort -rn | 60428 data |
| MiBの整数で表示 | du -sm app data | 48 app |
| 1000単位で表示 | du -sh --si . | 114M . |
| バイト単位(使用量) | du -s --block-size=1 . | 113491968 . |
| ファイル数 | du --inodes -d 1 . | sort -rn | 18 . |
duとdfの違い
| 項目 | du | df |
|---|---|---|
| 何を測るか | 指定したディレクトリ以下のファイルの使用量 | ファイルシステム全体の使用量と空き |
| 測り方 | ファイルを1つずつたどって足す | ファイルシステムの管理情報を読む |
| 速さ | ファイル数に比例して時間がかかる | すぐ終わる |
| 見えるもの | ディレクトリツリーから見えるファイル | 見えないものも含めた全体 |
| 主な用途 | どこが大きいかを探す | あとどれだけ空いているかを知る |
使う順番は「df -h で、いっぱいになっているファイルシステムを特定 → du でその中の大きいディレクトリを探す」です。測り方が違うため、2つの数値は完全には一致しません。数%程度の差は通常の範囲です。大きくずれているときは、次の原因を順に確認します。
duとdfの数値が合わない原因を再現する
再現には、200MBのファイルをext4でフォーマットしてマウントした、テスト用の小さなファイルシステムを使いました。マウントには管理者権限が必要です。以降の出力では、マウント先のパスを /mnt/test に置き換えて表示しています(表示は環境に合わせて置き換えています)。
truncate -s 200M disk.img
mkfs.ext4 -q -F disk.img
mkdir -p /mnt/test
mount -o loop disk.img /mnt/test
原因1:削除済みなのに開かれたままのファイル
ファイルを rm で消しても、そのファイルを開いているプロセスが残っていると、領域は解放されません。du からは見えなくなり、df の使用量には残るため、差が生まれます。
50MBのファイルを作り、tail -f で開いたまま削除します。
head -c 50M /dev/urandom > /mnt/test/big.log
du -sh /mnt/test; df -h /mnt/test | tail -n 1
51M /mnt/test
/dev/loop0 172M 51M 108M 32% /mnt/test
tail -f /mnt/test/big.log > /dev/null &
rm /mnt/test/big.log
du -sh /mnt/test; df -h /mnt/test | tail -n 1
20K /mnt/test
/dev/loop0 172M 51M 108M 32% /mnt/test
du は 20K に減ったのに、df の Used は 51M のままです。開いているプロセスは、/proc を見ると見つかります。
ls -l /proc/9337/fd | grep deleted
lr-x------ 1 root root 64 Oct 3 13:37 3 -> /mnt/test/big.log (deleted)
PIDがわからないときは、全プロセスを対象に探します。
find /proc/[0-9]*/fd -lname "*(deleted)" -printf "%p -> %l\n" 2>/dev/null
/proc/9337/fd/3 -> /mnt/test/big.log (deleted)
lsof が入っていれば lsof +L1 でも一覧できます(リンク数が0、つまり削除済みで開かれているファイルを表示するオプションです)。今回の環境では、メモリ上の一時ファイルも一緒に表示されました。
解放する方法は2つあります。
| 方法 | コマンド | 特徴 |
|---|---|---|
| プロセスを再起動・終了する | systemctl restart サービス名 など | 確実。ファイルを閉じた時点で解放される |
| 開かれたまま中身を空にする | : > /proc/PID/fd/番号 | プロセスを止められないときの手段 |
2つめの方法を試した結果です。
: > /proc/9337/fd/3
df -h /mnt/test | tail -n 1
/dev/loop0 172M 24K 158M 1% /mnt/test
Used が 51M から 24K に戻りました。動いているプロセスが書き込み中のログは、rm ではなく「: > ファイル名」や truncate -s 0 で空にすると、この状態を避けられます。
原因2:予約ブロック(df の Size − Used と Avail が合わない)
ext4 は、管理者用に一部の領域を予約しています(既定は5%)。この分は df の Avail に含まれません。
tune2fs -l disk.img | grep -E "Block count|Reserved block count|Block size"
Block count: 51200
Reserved block count: 2560
Block size: 4096
51200ブロックのうち2560ブロック(5%、約10MiB)が予約されています。予約率を1%に変えて、df の変化を比べました。
df -k /mnt/test | tail -n 1
tune2fs -m 1 /dev/loop0
df -k /mnt/test | tail -n 1
/dev/loop0 175392 4044 157012 3% /mnt/test
Setting reserved blocks percentage to 1% (512 blocks)
/dev/loop0 175392 4044 165204 3% /mnt/test
Used は 4044 のまま、Available だけが 157012 から 165204 へ 8192KiB 増えました。 減らした予約ブロック(2560 − 512 = 2048ブロック × 4KiB)と一致します。予約領域は、ディスクがいっぱいになったときに管理者が作業できる余地として用意されているものなので、/ のあるファイルシステムでは既定のままにしておくのがおすすめです。
また、最初の df の Size が 200M ではなく 172M だったように、ファイルシステム自身の管理領域(iノードの表やジャーナル)も du には現れません。
原因3:スパースファイル(見かけは大きいが、使用量は小さい)
スパースファイルは、中身のない部分にディスクを割り当てないファイルです。仮想ディスクのイメージなどで使われます。
truncate -s 1G /mnt/test/sparse.img
ls -lh /mnt/test/sparse.img
du -h /mnt/test/sparse.img
du -h --apparent-size /mnt/test/sparse.img
-rw-r--r-- 1 root root 1.0G Oct 3 13:37 /mnt/test/sparse.img
0 /mnt/test/sparse.img
1.0G /mnt/test/sparse.img
ls -l は 1.0G、du は 0、du --apparent-size は 1.0G です。このとき df の Used は 24K のままでした。172MBのファイルシステムに「1GBのファイル」が置けているのは、実際にはブロックを使っていないからです。ls -ls の先頭列でも、割り当て済みのブロック数(今回は 0)を確認できます。
| コマンド | 表示するもの |
|---|---|
| ls -l | 見かけのサイズ(ファイルの長さ) |
| du | ディスク上で実際に使っているブロックの量 |
| du --apparent-size | 見かけのサイズ |
| du -b | 見かけのサイズをバイト単位で(--apparent-size --block-size=1 と同じ) |
原因4:小さなファイルはブロック単位に切り上げられる
スパースファイルとは逆に、du のほうが見かけより大きくなる場合もあります。ファイルはブロック単位(今回は4KiB)で領域を使うためです。
printf "a" > /mnt/test/one.txt
du -h /mnt/test/one.txt
du -h --apparent-size /mnt/test/one.txt
stat -c "%s bytes, %b blocks of %B" /mnt/test/one.txt
4.0K /mnt/test/one.txt
1 /mnt/test/one.txt
1 bytes, 8 blocks of 512
1バイトのファイルが 4.0K を使っています。2バイトのファイルを1000個作ると、差がはっきりします。
mkdir /mnt/test/small
for i in $(seq 1 1000); do echo x > /mnt/test/small/f$i; done
du -sh /mnt/test/small
du -sh --apparent-size /mnt/test/small
4.0M /mnt/test/small
2.0K /mnt/test/small
中身は合計 2.0K でも、ディスク上では 4.0M です。小さなファイルが大量にあるディレクトリでは、ls の合計と du が大きく違って見えます。
原因5:マウントポイントの下に隠れたファイル
ディレクトリにファイルが入った状態で、そこへ別のファイルシステムをマウントすると、元のファイルは見えなくなりますが、領域は使われたままです。
head -c 7M /dev/urandom > demo/mounted/under.bin
mount -t tmpfs -o size=64M tmpfs demo/mounted
du -sh demo/mounted
0 demo/mounted
マウント中は 0 と表示されます。アンマウントすると、隠れていた 7M が現れました。
umount demo/mounted
du -sh demo/mounted
7.1M demo/mounted
サービスを止められないときは、/ を別の場所に bind マウントして中を確認する方法が知られています(mount --bind / /mnt/root としてから du -sh /mnt/root/対象。今回は未実行)。
原因6:ハードリンクは1回だけ数えられる
同じファイルに2つの名前(ハードリンク)があるとき、du は1回の実行の中で最初に見つけたほうだけを数えます。
ln app/logs/app.log data/hard.log
du -sh app data
du -shl app data
48M app
60M data
48M app
90M data
-l(--count-links)を付けると、リンクごとに数えるので data が 90M になります。引数の順番や指定の仕方で、ディレクトリごとの数字が変わることがあるのは、この仕組みのためです。
原因の切り分け表
| 状況 | 考えられる原因 | 確認コマンド |
|---|---|---|
| df の Used が du よりずっと大きい | 削除済みで開かれたままのファイル | lsof +L1、または find /proc/[0-9]*/fd -lname "*(deleted)" |
| df の Used が du より大きい(再起動後も) | マウントポイントの下に隠れたファイル | アンマウントして du、または bind マウント |
| du を一般ユーザーで実行した | 読めないディレクトリが集計されていない | sudo で実行し直す |
| Size − Used と Avail が合わない | 予約ブロック | tune2fs -l デバイス名 |
| ls の合計より du が小さい | スパースファイル | du --apparent-size と比べる |
| ls の合計より du が大きい | ブロック単位の切り上げ(小さなファイルが多い) | du --apparent-size と比べる |
| ディレクトリ別の値が実行ごとに違う | ハードリンク | du -l で比べる |
| 空きはあるのに書き込めない | iノードの不足 | df -i、du --inodes |
権限エラー(Permission denied)が出るとき
一般ユーザーで /var などを調べると、読めないディレクトリについて「du: cannot read directory '…': Permission denied」というメッセージが出て、その分は集計されません(今回は管理者権限で検証したため、このメッセージの再現は未実行です)。
| やりたいこと | 書き方 |
|---|---|
| 正確な値を知りたい | sudo du -h -x -d 1 /var | sort -rh |
| メッセージだけ非表示にしたい | du -h -d 1 /var 2>/dev/null | sort -rh |
2>/dev/null はエラーメッセージを捨てるだけで、読めなかった分が合計に入らない点は変わりません。容量の調査では sudo を付けて実行するのが確実です。
GNU版とmacOS(BSD版)のオプション差
macOS の du はBSD由来で、GNU版と一部のオプションが異なります。この表のmacOS側は未実行で、一般に知られている仕様をもとにまとめています。 手元の版は man du で確認してください。
| やりたいこと | Linux(GNU coreutils 9.4で確認) | macOS(BSD版・未実行) |
|---|---|---|
| 合計を読みやすく | du -sh | du -sh(同じ) |
| 深さの指定 | -d 1 または --max-depth=1 | -d 1 のみ(--max-depth はなし) |
| 総計の行 | -c | -c(同じ) |
| 別FSを跨がない | -x | -x(同じ) |
| パターンの除外 | --exclude="*.log" | -I マスク(例:-I "*.log") |
| 見かけのサイズ | --apparent-size、-b | -A |
| しきい値 | -t 10M | -t(版によって対応) |
| 更新時刻の表示 | --time | なし |
| ファイル数 | --inodes | なし |
| 単位の指定 | -k、-m、--block-size= | -k、-m、-g |
| 大きい順の並べ替え | sort -rh | sort -rh(版によって対応) |
両方で動くスクリプトにしたいときは、du -sk と sort -rn の組み合わせが無難です。-s、-k、-h、-d、-c、-x、-a は共通して使えます。macOS で GNU版と同じオプションを使いたい場合は、Homebrew の coreutils を入れると gdu という名前で利用できます(未実行)。
ncdu・find との使い分け
| ツール | 得意なこと | 向いている場面 |
|---|---|---|
| du | 集計結果を標準出力に出す | ワンライナー、スクリプト、ログへの記録 |
| ncdu | 画面上でディレクトリを行き来しながら調べる | 対話的に掘り下げたい、その場で削除もしたい |
| find | 条件(サイズ・日付・名前)でファイルを探す | 「100MB以上」「30日以上前」のような条件検索 |
| df | ファイルシステム全体の空きを見る | 最初の確認、監視 |
ncdu:矢印キーで掘り下げる
ncdu は追加で入れるツールです(Ubuntu では apt install ncdu)。起動すると集計のあと、大きい順の一覧が出ます。
ncdu -x demo
ncdu 1.19 ~ Use the arrow keys to navigate, press ? for help
--- /home/taro/demo ---
59.0 MiB [############] /data
47.2 MiB [######### ] /app
2.0 MiB [ ] /.hidden
4.0 KiB [ ] README.md
(パスの表示は環境に合わせて置き換えています。)上下キーで選び、Enter でそのディレクトリに入ります。data に入ると次の表示になりました。
/..
48.0 MiB [############] /backup
11.0 MiB [## ] /images
-x は du と同じく、別のファイルシステムを跨がないオプションです。q で終了します。削除(d キー)などのその他の操作は今回は未実行です。
find:条件でファイルを探してから du に渡す
find . -type f -size +10M -exec du -h {} + | sort -rh
48M ./data/backup/dump.sql.gz
30M ./app/logs/app.log
12M ./app/logs/access.log
「10MBより大きいファイルだけ」を大きい順に表示できます。du -a はすべてのファイルとディレクトリを出すのに対し、find は条件に合うファイルだけに絞れるのが利点です。バイト単位で正確に並べたいときは、find の -printf を使います。
find . -type f -printf "%s\t%p\n" | sort -rn | head -n 3
50331648 ./data/backup/dump.sql.gz
31457280 ./app/logs/app.log
12582912 ./app/logs/access.log
こちらは見かけのサイズ(バイト数)です。du の値(ディスク使用量)とは基準が違う点だけ意識しておきます。
スクリプトで使う:数値だけ取り出してしきい値と比べる
du の出力は「サイズ、タブ、パス」の形なので、cut -f1 で数値だけを取り出せます。スクリプトでは -h を使わず、-k(KiB)や -m(MiB)の整数で受け取ると、そのまま比較や計算に使えます。
du -sk d | cut -f1
4108
次のスクリプトは、ディレクトリの使用量がしきい値以上になったら、内訳の上位3件を一緒に表示します。sh(POSIXシェル)で動く書き方です。
#!/bin/sh
# 使い方: sh ducheck.sh ディレクトリ しきい値(MiB)
dir=$1; limit_mb=$2
used_kb=$(du -sk "$dir" | cut -f1)
used_mb=$(( used_kb / 1024 ))
if [ "$used_mb" -ge "$limit_mb" ]; then
echo "WARN: $dir は ${used_mb}MiB(しきい値 ${limit_mb}MiB 以上)"
du -k -d 1 "$dir" | sort -rn | head -n 3
else
echo "OK: $dir は ${used_mb}MiB"
fi
約4MiBのテスト用ディレクトリ d(d/logs に3MiB、d/tmp に1MiB)に対して、しきい値を 3 と 10 にして実行した結果です。
$ sh ducheck.sh d 3
WARN: d は 4MiB(しきい値 3MiB 以上)
4108 d
3076 d/logs
1028 d/tmp
$ sh ducheck.sh d 10
OK: d は 4MiB
日付と一緒に1行ずつ追記していくと、増え方の記録になります。
echo "$(date +%F) $(du -sk d | cut -f1)" >> du_history.txt
2026-10-03 4108
| ポイント | 理由 |
|---|---|
| -h ではなく -k / -m を使う | 4.1M のような文字列は数値比較に使えない |
| パスは引用符で囲む | 空白を含むディレクトリ名でも正しく動く |
| cut -f1 で取り出す | 区切りはタブ。パスに空白があっても影響を受けない |
| 定期実行では -x を検討 | 別ファイルシステムまでたどって時間がかかるのを避ける |
容量調査の手順(上から順に実行)
# 1. どのファイルシステムがいっぱいかを確認
df -h
# 2. そのマウントポイントの直下を大きい順に(別FSは跨がない)
sudo du -h -x -d 1 / | sort -rh | head -n 10
# 3. 大きかったディレクトリをさらに掘る
sudo du -h -x -d 1 /var | sort -rh | head -n 10
# 4. ファイル単位で上位を確認
sudo du -ah -x /var/log | sort -rh | head -n 10
# 5. du の合計が df より小さいときは、削除済みで開かれたままのファイルを確認
sudo lsof +L1
| チェック | 内容 |
|---|---|
| df で対象を絞ったか | いっぱいのファイルシステムだけを du で調べる |
| -x を付けたか | / を調べるときは別FSを除外する |
| sudo を付けたか | 読めないディレクトリがあると合計が小さくなる |
| sort -rh と -h を組にしたか | -k のときは sort -rn |
| 書き込み中のログを rm していないか | 空にするなら : > ファイル名 |
よくある質問
Q. du -sh * と du -h -d 1 . はどう違いますか? A. du -sh * はシェルが展開した名前ごとの合計で、ドットで始まる名前が入りません。du -h -d 1 . は du がディレクトリをたどるので隠しディレクトリも含まれ、最後に全体の合計(.)も表示されます。直下のファイルは行として出ないため、必要なら -a を足します。
Q. sort -rh が使えない環境ではどうすればよいですか? A. du -sk * | sort -rn のように、KiB単位の整数で出して数値として並べ替えます。読みやすさは下がりますが、どの環境でも同じ結果になります。
Q. du の結果が出るまで時間がかかります。 A. du はファイルを1つずつたどるため、ファイル数が多いと時間がかかります。-x で別のファイルシステムを除く、-d 1 で大きいディレクトリを特定してから範囲を絞る、という順で進めると待ち時間を短くできます。
Q. du と ls -l のサイズが違うのはなぜですか? A. ls -l はファイルの長さ(見かけのサイズ)、du はディスク上で使っているブロックの量を表示するためです。du --apparent-size を付けると ls -l と同じ基準になります。
まとめ
- 直下を大きい順に並べるなら du -sh * | sort -rh、隠しディレクトリも含めるなら du -h -d 1 . | sort -rh
- du -h には sort -rh、du -k には sort -rn を組み合わせる
- / を調べるときは -x で別ファイルシステムを除き、sudo を付ける
- df は全体の空き、du は内訳。df で対象を絞ってから du で掘り下げる
- du と df の差が大きいときは、削除済みで開かれたままのファイル(lsof +L1)、マウントポイントの下、予約ブロックを順に確認する
- du は実際の使用量、--apparent-size は見かけのサイズ。スパースファイルや小さなファイルの集まりで差が出る
- 対話的に調べるなら ncdu、条件で探すなら find、記録や自動化には du が向いている
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux duコマンドの使い方 容量を大きい順に調べる定番ワンライナー集」
株式会社RJCでは、duコマンドによる容量調査のようなLinuxの基礎を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。