あるディレクトリ以下の総ファイルサイズを取得するには
あるディレクトリ以下の総ファイルサイズを取得する際に、
$ 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 7月 21 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の値を表示しています。