たまにディレクトリ中のファイルサイズの合計値を、再帰的に集計したいときがある。
で、いつも考えなしにこちらのサイトで紹介されているコマンドを叩いていたわけなんですが、
find -type f -printf "%s\n" |perl -ne '$i++; $byte += $_; $str = "\r$i files, $byte byte"; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str'
mac(osx)だと動かない。どうやらmacのfindのオプションに printf がないもよう。
Why does Mac’s $find not have the option -printf?
そこで printf f ‘%s\n’ のかわりに stat -f ‘%z’ を代用してみた。
find ./ -print0 | xargs -0 stat -f '%z' | perl -ne '$i++; $byte += $_; $str = "\r$i files, $byte byte"; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str';
とりあえず期待した結果になるが、カレントディレクトリのサイズも合計されてしまう。。
ちょっとカレントディレクトリのサイズを除外する方法がわからなかったので、このまま関数にして使うことにした。
# linux
function bu(){ find -type f -printf "%s\n" |perl -ne '$i++; $byte += $_; $str = "\r$i files, $byte byte"; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str'; }
# mac
function bu(){ find ./ -print0 | xargs -0 stat -f '%z' | perl -ne '$i++; $byte += $_; $str = "\r$i files, $byte byte"; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str'; }
参考サイト
以下のサイトを参考にさせていただきました。ありがとうございます!