web-dev-qa-db-ja.com

「du」のすべての数値を合計する

duから取得する最初の数値を計算したい

du -b /tmp/*
6       /tmp/216c6f99-6671-4865-b8bc-7205f5388752_resources
668669  /tmp/hadoop7887078727316788325.tmp
6       /tmp/hadoop-hdfs
42456   /tmp/Hive
32786   /tmp/hsperfdata_hdfs
6       /tmp/hsperfdata_Hive
32786   /tmp/hsperfdata_root
262244  /tmp/hsperfdata_yarn

最終的な合計は

sum=6+668669+6+42456+32786+6+32786+262244


echo $sum

どのようにawkまたはPerlのワンライナーでそれを行うことができますか?

7
yael

AWKの場合:

{ sum += $1 }
END { print sum }

そう

du -b /tmp/* | awk '{ sum += $1 } END { print sum }'

duはディレクトリとその子の累計を生成するため、/tmpの下のディレクトリにサブディレクトリがある場合、結果は正しくありません。

du -sは、合計を正しく計算します(非表示のものも含め、/tmpのすべてのサブディレクトリとファイル):

du -sb /tmp

du -cは、リストされたディレクトリとファイルの合計も正しく計算します。

du -cb /tmp/*
16
Stephen Kitt

使用できるのは簡単です。

 du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'

ワイルドカードを使用していない場合、/tmpなどのディレクトリ名を使用している場合、du -b /tmpの出力は次のようになるため、最後のエントリを回避する必要があります。

size1 file1
size2 file2
size_total .

だから今、あなたはこの最後のエントリを避けるべきなので、以下を使用します:

du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'

ただし、-sオプションを使用することもできます。これにより、サマリーが計算されるため、値を追加する必要はなく、最後の値を出力するだけです。

du -s directory
4
Prvt_Yadav

du -cを使用して、選択したファイルの合計を生成することもできます。これは、duの引数がディレクトリでない場合でも機能しますが、du -sの場合はそうではありません。

$ du -sb file1 file2
17  file1
18  file2

$ du -cb file1 file2
17  file1
18  file2
35  total

ところで、インタラクティブな使用のために、-hまたはブロックサイズの他の乗数の代わりに-bオプションを追加することをお勧めします。これにより、人間が読める単位形式でサイズが出力されます。

$ du -ch file1 file2
4.0K    file1
4.0K    file2
8.0K    total
4
jimmij