2010-12-14 8 views
3

ディレクトリ内のすべてのgzipファイルのバイト数を知る必要があるbashスクリプトがあります。今のところ、私はそれがサブディレクトリのない単一のディレクトリだと仮定しています。しかし、私はファイルのTONを持ってディレクトリ内のすべてのgzipファイルのバイト数をカウントします。

du -scb /my/dir/*.gz|tail -n 1

:それはこのような何かをすることは非常に魅力的です。 *.gzは何らかのオーバーフロー状態に拡張されませんか?この番号を確認する、より速く、より安全な方法がありますか?

+0

あなたは何が良いようです。まともな実装であれば、64ビットのファイル(2GB以上、つまり64ビットのファイルもサポートします)、したがって64ビットの合計もサポートされます。 –

+1

@Chris彼はコマンドラインの長さの限界を超えることを心配していると思います。ほとんどのLinuxシステムでは、かなり巨大です(私が正しく覚えていれば128kBですが)いくつかの* nixesではかなり小さいです(Solarisでは255バイトのようなものです)。 –

+0

コマンドラインの長さの制限は私の心配です。その値を設定してbashから取得する方法はありますか? – User1

答えて

4

この作品と "安全" である:

(find . -type f -print0 | 
    xargs -0 stat -c '%s' | 
    tr '\n' '+'; echo 0) | 
    bc 

仕組み:

  • まず、 '.gzを' ファイルを検索しfindを使用しています。それらをヌルセパレータで印刷すると、奇妙なファイル名に対応できます。
  • xargsは、ファイル名のグループを管理しやすい塊に分割します。それらのファイル名をstat -c '%s'に与えて、サイズをバイト単位で取得してください(感謝@Fritschy)。
  • trは、改行を+に変換します。エコーは最後に1つ余分に0を加え、改行を加えます。これは、厄介なプラス記号で終わることはないので、bcは入力の最後に改行が必要です。
  • 巨大な和をbcに送ります。あなたは巨大な値が必要な場合は
+0

いいえ、 'stat(1)'をチェックしてください。これは、与えられたフォーマットに従ってファイルと印刷情報を統計できます。 –

+0

@Fritschy:ありがとう、私は 'stat(1)'について知らなかった。答えに組み込まれました。 –

1
echo $(($(find . -type f -name '*.gz' -printf '%s+') 0)) 

'%s+0'から'%s+'を変更し、変更$((... 0))... | bc

編集:さらに大きな値については、あなたが%k代わりの%sを使用する場合があります、あなたにキロバイトを与える。整数がオーバーフローする可能性があるためです。

私たちはbashで組み込み関数しか使用していないので、実行可能ファイルの引数の長さに問題があるかどうかはわかりません。

関連する問題