Fusic 北岸です。
もう今年も終わりますね。
休みの日に近所でバドミントンをしているのですが、
昨日で今年最後の分が終わってしまいました。
打ち損じでカツーンなんて音をさせてばかりではありますが、来年も楽しく頑張ります!
さてさて、今回のテーマは 「CUIでファイルサイズの合計を調べる」 です。
すごく基本的な内容ではありますが、以前ちょっと気になって調べたのでまとめておきます。
ファイルサイズを調べるコマンド
皆さんは、ファイルサイズを調べる時に、どのようなコマンドを使用されていますか?
私がすぐに思いつくのは、次のコマンドです。
$ ls -l |
そして、ディレクトリの容量を調べるなら、このコマンドですね。
$ du |
しかし、この du というコマンド、きちんとファイルサイズを測れません。
この du は、ブロックサイズを単位としてサイズを計測しています。
今回用意したシステムは ブロックサイズが4096バイト(=4.0KB) なので、
例えば次のような結果が得られます。
sky@ub1110x64:~/contrail$ ls -l ./substance/ 合計 12 -rw-rw-r-- 1 sky sky 4097 2011-12-26 07:22 ice_grain -rw-rw-r-- 1 sky sky 4096 2011-12-26 07:22 moisture |
sky@ub1110x64:~/contrail$ du -ah ./substance/ 4.0K ./substance/moisture 8.0K ./substance/ice_grain 16K ./substance/ |
たった1バイトしか違わないのに、du コマンドだと 4.0KB も違う事になっていますね。
どうやってファイルサイズを測るか
では、どうすればブロックサイズに左右されずに、
フォルダ内の容量を測れるのでしょうか。
調べて分かったのは、 find コマンドです。
一例を示します。
$ find ./ -printf "%s\n" |
階層的にディレクトリ内ファイルを検索してくれるコマンド find には、
そのファイルに関する情報を出力してくれるアクションがあります。
それが 「-printf」 です。
「 find ./ 」のみだと、カレントディレクトリ配下のディレクトリの内容を出力するだけですが、
「-printf」を利用する事により、出力内容を変える事が出来ます。
ここで使用しているフォーマットは次の通りです。
%s : ファイルサイズのバイト表示
\n : 改行
実行結果の一例を示します。
sky@ub1110x64:~/contrail$ ls -l * sky: 合計 24 -rw-rw-r-- 1 sky sky 6789 2011-12-26 07:22 high -rw-rw-r-- 1 sky sky 1234 2011-12-26 07:22 light -rw-rw-r-- 1 sky sky 9999 2011-12-26 07:22 scraper substance: 合計 12 -rw-rw-r-- 1 sky sky 4097 2011-12-26 07:22 ice_grain -rw-rw-r-- 1 sky sky 4096 2011-12-26 07:22 moisture |
sky@ub1110x64:~/contrail$ find ./ -printf "%s : %f\n" 4096 : ./ 4096 : sky 1234 : light 6789 : high 9999 : scraper 4096 : substance 4096 : moisture 4097 : ice_grain |
※見やすいようにファイル名(%f)も表示しています。
sky@ub1110x64:~/contrail$ du -ah 4.0K ./sky/light 8.0K ./sky/high 12K ./sky/scraper 28K ./sky 4.0K ./substance/moisture 8.0K ./substance/ice_grain 16K ./substance 48K . |
ちなみに、次のようにディレクトリ指定を省略すれば、
カレントディレクトリ配下を検索するため、同じ出力が得られます。
$ find -printf "%s : %f\n" |
現状のままでは、各ファイルやディレクトリのサイズが列挙されただけで、合計の値が得られていません。
もう一手間加えます。
というわけで、 awk コマンドを組み合わせたものがこちらです。
sky@ub1110x64:~/contrail$ find ./ -printf "%s\n" | awk '{ sum += $1; }; END { print sum }' 38503 |
各ファイルサイズについて、{ sum += $1; }; の部分で次々と足し合わされ、
END { print sum } の部分によって、最後に1回だけ、変数 sum が出力されます。
いかがでしょうか。
私にとって、awk コマンドはまだまだ慣れないものではありますが、
とても応用が効きそうなコマンドだなと思いました。
物理をやってたあの頃
研究室を思い出すと、、、やっぱりまだありました、変なもの、不思議なもの。
前回は片栗粉でしたが、今回は ペットボトル です。
それは エッキー って呼ばれてました。
中身は、500ml いっぱいの水と、砂が4分の1程度、ピンが3、4個ほどだったと思います。
では、何のためのものなのかと言うと 「液状化現象」 を見るためです。
液状化っていうと、地震の時に水がしみ出してくるアノ現象ですね。
使い方としては、
このエッキーをよく振って、静かに置きます。
この時、ピンは砂に埋もれて見えない状態になっているはずです。
この状態で、デコピンなどしてエッキーに刺激を与えると、ピンが飛び出してきます。
これが、地震後の液状化に対応しています。
ちなみに最近知ったのですが、
エッキーって、商品名でした。
どうも、キットとして売られているようです。
おしまいです。
ではでは。
du の `-b’ オプションで良いんじゃないかな。
>schemeさん
コメントありがとうございます。
確かに、du のオプションで -b を追加すると、
バイト単位できっちり表示されますね。
ご指摘ありがとうございました。