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


20

これはいくつかのファイルをリストするために使用しているコマンドです:

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スクリプトは機能していません。

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

回答:


26

まず'、傾斜した引用符()ではなく、一重引用符()を使用する必要があります`

awkインラインスクリプトは次のように考えられます。

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

そのため、初期化する必要はありませんtotalawkゼロに初期化します)。また、ループする必要はありませんawk。入力の各行で既にスクリプトを実行します。


1
要約すると、ワンライナーは次のようになります find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
。–


16

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

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

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

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

ls -lrt | sumcol 5

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


事実、私はなぜそのための標準的なユーティリティがないのだろうと思っていました。
-enzotib

.aliasesファイルに直接入ります。
コンラッドルドルフ

14

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

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

1
duの優れた使用。いい例です。追加の利点として、Gigで出力を取得するために「-h」オプションをduに追加できます。その後、数字などをカウントする必要はありません。サイズが約1188800 KBのファイルの束でテストを実行しました。どれくらい大きいの?関係なく、du -ch --files0-from=-合計が「9.0G」であることを教えてくれます。スウィーエット!
マイクS

甘い、デュの優れた使用!
haridsv

また、合計のみに関心がある場合は、出力をにパイプしtail -1ます。
haridsv

4

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

1

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

あるjqユーティリティは?debianディストリビューション(Debian 4.9.51-1(2017-09-28)x86_64 GNU / Linux)には見つからないようです
Death Metal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.