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のワンライナーでそれを行うことができますか?
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/*
使用できるのは簡単です。
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
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