有没有办法总结列出的文件的大小?

有没有办法总结列出的文件的大小?

这是我用来列出一些文件的命令:

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

等等。

现在我想通过对第五列求和来计算这些文件的总大小。我想使用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 }'

因此,无需初始化totalawk将其初始化为零),也无需循环,awk已经在每一行输入上执行脚本。

答案2

@enzotib 已经指出了你的语法错误是什么 - 我要稍微切题了。

对一列数字求和是不断出现的事情之一。我最终得到了这个 shell 函数:

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

相关内容