あるディレクトリ以下の総ファイルサイズを取得するには

あるディレクトリ以下の総ファイルサイズを取得する際に、

$ du -hs ディレクトリ

のように、duコマンドを使った例を紹介されることが多いのですが、
duコマンドが返すのはブロックサイズであり、ファイルサイズではないため正確な数値は得られません。
(ちなみに、「-s」は総合計サイズのみを表示するオプションで、
「-h」は人間にわかりやすい単位で表示するオプションです。)


例えば、以下のような実験でわかります。

$ mkdir dir_size_test
$ echo -n 'hello' > dir_size_test/hello.txt
$ ls -l dir_size_test/hello.txt
-rw-r--r-- 1 yarakawa yarakawa 5  721 15:59 dir_size_test/hello.txt
$ du -hs dir_size_test/
8.0K    dir_size_test/

「dir_size_test」の中にあるファイルは「hello.txt(5バイト)」のみで、
「ls -l」の結果では5バイトと表示しているのに対し、
「du -hs」の結果では8.0Kバイトと表示しています。


他にやり方はあるのかもしれませんが、
「あるディレクトリ以下の総ファイルサイズを知りたい」
という場合は以下のようなコマンドを実行すべきと思います。

$ find 対象ディレクトリ -type f -printf '%s\n' | awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'

findコマンドで「対象ディレクトリ」以下について、
「-type f」オプションによりすべてのファイルを一覧し、
「-printf '%s\n'」のオプションで各行にバイト数を出力しています。
それを、パイプでawkにつなぎ、awkではawk内でsumという変数を0クリアし、
各行を処理する際にその値をsumに加えていき、最後に変数sumの値を表示しています。