【Linux】du コマンド(ディレクトリの深さを指定など)

duコマンドの使い方です。

duコマンドをうまく使うと、現在 Linux マシンのどのディレクトリが一番ディスク容量を使っているのかを集計し、分かりやすく表示させることができます。

 

 

du コマンドはディスク使用量をディレクトリごとに集計するコマンド

単純に「du」だけでもコマンドは実行されますが、分かりにくいです。

[root@SAKURA_VPS /]# du ← / ディレクトリから「du」コマンドを実施しています。

4       ./boot/grub ← 4KB
2404    ./boot/grub2/i386-pc ← 2404KB、約2.4MBあります。
3296    ./boot/grub2/locale
2504    ./boot/grub2/fonts
8244    ./boot/grub2
0       ./boot/efi/EFI/centos
0       ./boot/efi/EFI
0       ./boot/efi
283104  ./boot
0       ./dev/vfio
0       ./dev/snd
0       ./dev/mqueue
0       ./dev/hugepages/libvirt/qemu
0       ./dev/hugepages/libvirt
0       ./dev/hugepages
0       ./dev/disk/by-id
0       ./dev/disk/by-uuid
0       ./dev/disk/by-partuuid
0       ./dev/disk/by-partlabel
0       ./dev/disk/by-path

 

 

duコマンドの単位は「1024バイト」

duのマニュアルを読むと、デフォルトでは「1024バイト単位(つまり1KB)」で表示されます。

'du' reports the amount of disk space used by the specified files and
for each subdirectory (of directory arguments).  Synopsis:

     du [OPTION]... [FILE]...

   With no arguments, 'du' reports the disk space for the current
directory.  Normally the disk space is printed in units of 1024 bytes,
but this can be overridden (*note Block size::).  Non-integer quantities
are rounded up to the next higher unit.

 

 

ディレクトリの深さ(深度)を指定してサイズの表示単位を変更すると見やすくなる

ルートディレクトリからディレクトリの深さとサイズの表示単位を変更すると見やすくなります。

 

【オプション】

[root@SAKURA_VPS /]# pwd
/

[root@SAKURA_VPS /]# du -d 1 -h
277M    ./boot
0       ./dev
du: `./proc/6669/task/6669/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/task/6669/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
0       ./proc
29M     ./run
0       ./sys
43M     ./etc
1.4G    ./root
108K    ./tmp
779M    ./var
6.9G    ./usr
3.8G    ./home
0       ./media
0       ./mnt
0       ./opt
0       ./srv
14G     .
[root@SAKURA_VPS /]#

 

上のコマンドの結果より「/root」と「/home」ディレクトリでギガ単位でディスク容量を使用していることが分かります。

ログなど保存している「/var」ディレクトリはさほどディスク容量を使用していません。

 

--max-depth=X オプションの場合

「--max-depth=X」オプションもありますが、「-d X」オプションと同様です。

X にディレクトリの深さを指定します。

[root@SAKURA_VPS /]# du -h --max-depth=1 
277M    ./boot 
0       ./dev 
0       ./proc 
29M     ./run 
0       ./sys 
43M     ./etc 
1.4G    ./root 
260K    ./tmp 
6.3G    ./var 
6.9G    ./usr 
933M    ./home 
0       ./media 
0       ./mnt 
0       ./opt 
0       ./srv 
16G     . 
[root@SAKURA_VPS /]#

 

 

 

 

 

ディレクトリを絞り、結果をソートすると更に見やすくなる

du コマンドでディレクトリを絞り、更に結果を「sort」コマンドでソートすると結果が見やすくなります。

 

まずは単純に「sort」コマンドだけを入れた場合です。(ディレクトリの深さは「2」にしています)

[root@SAKURA_VPS /]# du -d 2 -h | sort
0       ./boot/efi
0       ./dev
0       ./dev/block
0       ./dev/bsg
0       ./dev/bus
0       ./dev/char
0       ./dev/cpu
0       ./dev/disk
0       ./dev/dri
0       ./dev/hugepages

 

~ 省略 ~

 

1.3G    ./usr/lib ← 1.3G が上に来ています。
1.4G    ./root
1.4M    ./root/.local ← 1.4M が 1.3G より数値が大きいことになっています。
1.5G    ./usr/share
1.5M    ./etc/pki
100K    ./etc/rpm
104K    ./etc/profile.d
105M    ./var/www
108K    ./tmp
120K    ./etc/letsencrypt

 

単純に「sort」コマンドを入れただけだと「昇順(0→1→2→3→4→5)」で表示されます。

そのため「sort -r」コマンドで「降順(5→4→3→2→1→0)」で表示されるようにします。

 

更に「単位」が合っていなくてソートがうまく出来ていないため、「単位」を合わせます。

[root@SAKURA_VPS /]# du -d 2 -m | sort -r
du: `./proc/9154/task/9154/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/task/9154/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
919     ./home/test
9       ./boot/grub2 ← 「数値」としてソートではなく「辞書順」でソートされてしまいます。
8       ./etc/udev
779     ./var
756     ./root/.pyenv
7       ./root/.npm
6997    ./usr
64      ./usr/sbin
6       ./root/pyparsing-2.0.3
54      ./usr/include
532     ./root/.cache
50      ./var/spool
5       ./var/cache

 

「11111」より「9」の方が上に来ます。

sortコマンドはデフォルトで「辞書順」に表示されるので(これはこれで非常に便利です)、「数値」でソートされるようにします。

[root@SAKURA_VPS /]# du -d 2 -m | sort -r -n
du: `./proc/9436/task/9436/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/task/9436/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
13373   .
6997    ./usr
3834    ./home
3148    ./usr/lib64
1519    ./usr/share
1416    ./root
1264    ./usr/lib
919     ./home/test
779     ./var
756     ./root/.pyenv
532     ./root/.cache

 

これでようやくやりたいことはできるようになったと思います。

他に「du」コマンドのオプションとしては「--exclude=<パターン>」があります。

これはパターンに合ったディレクトリやファイル名を除外するというオプションです。

[root@SAKURA_VPS /]# du -d 2 -m --exclude='proc' | sort -r -n
13373   .
6997    ./usr
3834    ./home
3148    ./usr/lib64
1519    ./usr/share
1416    ./root
1264    ./usr/lib
919     ./home/test
779     ./var
756     ./root/.pyenv
532     ./root/.cache

 

 

■「--exclude」オプションの詳細

日本語

       --exclude=PATTERN
              PATTERN に一致するファイルを含めない '-X FILE'

 

英語

'--exclude-from=FILE'
     Like '--exclude', except take the patterns to exclude from FILE,
     one per line.  If FILE is '-', take the patterns from standard
     input.

   →'--exclude' オプションのように、FILEから除外するパターンを1行に1つずつ取ります。
    FILEが ' - 'の場合、標準入力からパターンを取り出します。

'--exclude=PATTERN'
     When recursing, skip subdirectories or files matching PATTERN.  For
     example, 'du --exclude='*.o'' excludes files whose names end in
     '.o'.     

   →再帰するときは、PATTERNに一致するサブディレクトリまたはファイルをスキップします。
    たとえば、 'du --exclude ='*.o' は名前が '.o' で終わるファイルを除外します。          

 

つまり「--exclude='proc'」の場合は「proc」ディレクトリをスキップしますが、ファイル名で「proc」があった場合もスキップされてしまうので注意です。

その仕様が分かっていれば、「--exclude=PATTERN」を使っても特に問題は生じないと思います。

 

 

 

du コマンドで巨大なファイルを見つけた時の対処方法

du コマンドを利用して巨大なファイルを見つけた場合の対処方法として以下が考えられます。

 

ファイルの中身を空にするコマンド

以下の巨大なファイルが見つかりました。

[root@SAKURA_VPS python]# ls -lh 
合計 5.4G 
-rw-rw-r-- 1 test test 5.4G  6月  8 00:00 app.log  ← 5.4GB あります。
[root@SAKURA_VPS python]#

 

本当はログのローテートをするべきですが、ここでは「ファイルの中身を空にするコマンド」を試します。

 

コマンドでファイルの中身を空にするには「cp /dev/null <空にするファイル>」コマンドを使用します。

[root@SAKURA_VPS python]# cp /dev/null app.log 
cp: `app.log' を上書きしますか? yes 
[root@SAKURA_VPS python]# ls -lh 
合計 0 
-rw-rw-r-- 1 test test 0  6月 10 10:17 app.log  ← ファイルの中身が空になっています。
[root@SAKURA_VPS python]# cat app.log 
[root@SAKURA_VPS python]#

 

 

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人