du -sh /tmp
とすると、/tmp 以下の合計容量が取得できるが、/tmp 以下にあるディレクトリごとの容量を取得するには、ちょっとした小手先のテクニックが必要となる。
※-sは総計を表示するオプション
-hは容量を適当な単位で表示するオプション
結論はdu -sh /tmp/*/
あるいはdu -h --max-depth=1 /tmp
であるが、よく使用するのは「今いるディレクトリ以下の各ディレクトリごとの容量」なので、それをメインで書き、説明していく。
du -sh ./*/
# 以下でも可
du -sh */
# あるいは
du -h --max-depth=1
なぜ ./*/
になるのか?(./*
は実質、*
と同じ意味なので、*/
でも可だが、出力されるディレクトリ名の先頭に./
がつくかどうかの違いがでる。)
まず*
だけだと、ファイルも含めた全てを指すことになる。
下の実行結果をみると、*
の場合の表示個数にはファイルを含んでいる。
*/
で、「ファイルも含めた全て」のうち、さらに/
を最後に付けられるもの、つまりはディレクトリを示している。
ファイルを除いた、今いるディレクトリ以下の各ディレクトリを列挙することができているので、duコマンドは列挙されたそれぞれのディレクトリに対して処理を行っているのだ。
$ cd /tmp
$ ll
合計 60
drwxr-xr-x 2 root root 4096 8月 5 10:27 2015 hsperfdata_root
drwxr-xr-x 2 tomcat tomcat 4096 8月 19 13:39 2015 hsperfdata_tomcat
drwx------. 2 root root 4096 5月 8 00:08 2014 keyring-3DceEK
drwx------ 2 root root 4096 3月 13 16:21 2015 keyring-YmTNnu
drwx------ 2 gdm gdm 4096 7月 6 09:27 2015 orbit-gdm
drwx------ 2 root root 4096 6月 18 18:55 2015 pulse-FESn7YOlRwHP
drwx------ 2 gdm gdm 4096 7月 6 09:26 2015 pulse-fFvnumJu33Cq
drwx------. 2 root root 4096 5月 8 00:08 2014 pulse-yzbWAte1EnjS
-rw-r--r-- 1 root root 0 8月 27 14:18 2015 samplefile
$ du -sh ./*
4.0K ./hsperfdata_root
36K ./hsperfdata_tomcat
4.0K ./keyring-3DceEK
4.0K ./keyring-YmTNnu
4.0K ./orbit-gdm
4.0K ./pulse-FESn7YOlRwHP
4.0K ./pulse-fFvnumJu33Cq
4.0K ./pulse-yzbWAte1EnjS
0 ./samplefile
$ du -sh ./*/
4.0K ./hsperfdata_root/
36K ./hsperfdata_tomcat/
4.0K ./keyring-3DceEK/
4.0K ./keyring-YmTNnu/
4.0K ./keyring-oObzRQ/
4.0K ./orbit-gdm/
4.0K ./pulse-FESn7YOlRwHP/
4.0K ./pulse-fFvnumJu33Cq/
4.0K ./pulse-yzbWAte1EnjS/
-s
をつけずに--max-depth=1
をつけているdu -h --max-depth=1
の方も見てみる。
$ du -h --max-depth=1
4.0K ./hsperfdata_root
36K ./hsperfdata_tomcat
4.0K ./keyring-3DceEK
4.0K ./keyring-YmTNnu
4.0K ./orbit-gdm
4.0K ./pulse-FESn7YOlRwHP
4.0K ./pulse-fFvnumJu33Cq
4.0K ./pulse-yzbWAte1EnjS
4.0K ./.ICE-unix
70K .
出力が同じように見えるが、du -sh ./*/
では出力されていない行が2つ出ている。
一つは隠しファイルとなるdotfileで、もう一つは/tmp 自体の合計容量だ。
ワイルドカード指定 "*" ではドットファイルは対象にならないに書かれている通り、ワイルドカード*
はdotfileの.
には適用されない。
du -sh ./*/
でもdotfileを表示しようとすると、以下のようになる。
$ echo .* | xargs -n1
.
..
.crontab.69KxtV.swp
.ICE-unix
$ echo .[^.]* | xargs -n1
.crontab.69KxtV.swp
.ICE-unix
$ du -sh .[^.]*/
4.0K .ICE-unix/
$ du -sh .[^.]*/ */
4.0K ./hsperfdata_root/
36K ./hsperfdata_tomcat/
4.0K ./keyring-3DceEK/
4.0K ./keyring-YmTNnu/
4.0K ./orbit-gdm/
4.0K ./pulse-FESn7YOlRwHP/
4.0K ./pulse-fFvnumJu33Cq/
4.0K ./pulse-yzbWAte1EnjS/
4.0K ./.ICE-unix/
/tmp 自体の合計容量はここでは特に必要としていないが、それも出そうとすればdu -sh .[^.]*/ */ .
となる。
du -sh */
とdu -h --max-depth=1
のどちらを使うべきかは、隠しファイルも対象にしたいのかどうかで決めるといい。
出力して確認するだけだと--max-depth=1
の方が出力される情報が多いが、日常使いを考えると最後に/
を入れるだけの方も簡易でいい。
気を付けるべきはスクリプトに組み込むときやパイプでつなげてコマンドを打ったりするとき。
何も考えず安易に--max-depth=1
を使って、隠しファイルを対象にするつもりがなかったのに処理してしまうということがないように。あるいは隠しファイルも対象にすべきなのに漏れることがないように。