以下は、一部のファイルの一覧表示に使用するコマンドです。
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
スクリプトは機能しません。
私が間違っているか解決策がある場合は、私に提案または修正してください。
答え1
'
まず、傾いた一重引用符()の代わりにまっすぐな一重引用符()を使用する必要があります`
。
インラインスクリプトはawk
次のとおりです。
ls -lrt | awk '{ total += $5 }; END { print total }'
したがって、初期化total
(awk
ゼロに初期化)、ループがなく、awk
各入力行でスクリプトがすでに実行されています。
答え2
@enzotibはすでに構文エラーが何であるかを指摘しています。私は接線を始めます。
数字のリストを合計することは、引き続き出てくるものの1つです。私はこのシェル関数で終わりました。
sumcol()
{
awk "{sum+=\$$1} END {print sum}"
}
これにより、ソリューションは次のようになります。
ls -lrt | sumcol 5
これにより、5列の数字を合計して値が印刷されます。
答え3
以下を使用してこれを実行する別の方法がありますdu
。
find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
答え4
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