web-dev-qa-db-ja.com

リストされたファイルのサイズを合計する方法はありますか?

これは、いくつかのファイルを一覧表示するために使用しているコマンドです。

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

等々。

次に、5番目の列を合計して、これらのファイルの合計サイズを計算します。私はawkを使用してこれを行うことを考えたので、特定のディレクトリで以下をテストしました

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

何が問題なのか、なぜ構文エラーなのかわかりません。

やってみようと思っています

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

これも同じですが、単純なawkスクリプトが機能していません。

私が間違っている場合、またはこれに回避策がある場合は、私に提案または修正してください。

20
munish

まず最初に、一重引用符(')、傾斜したもの(`)。

awkインラインスクリプトは次のようになります。

ls -lrt | awk '{ total += $5 }; END { print total }'

したがって、totalを初期化する必要はなく(awkはそれをゼロに初期化します)、ループする必要はありません。awkは、入力のすべての行でスクリプトをすでに実行しています。

27
enzotib

@enzotibはあなたの構文エラーが何であるかをすでに指摘しました-私は少し接線で行くつもりです。

数値の列を合計することは、ポップアップし続けるものの1つです。私はこのシェル関数で終わっています:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

これにより、ソリューションは次のようになります。

ls -lrt | sumcol 5

これにより、列5の数値が合計され、値が出力されます。

16
camh

duを使用してこれを行う別の方法を次に示します。

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
14
tuxce

HP-UXの場合findにも-printfオプション。これはbcの計算式を作成するのに役立ちます。

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

式が大きくなりすぎる場合は、段階的に計算できます。

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
4
manatwork

GNU find

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

GNU stat

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

BSDの場合stat

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
1
nisetama