有没有一种方法可以汇总列出的文件大小?


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脚本不起作用。

如果我错了,或者有解决方法,请建议或纠正我。

Answers:


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已经指出您的语法错误是什么-我要讲一点切线。

汇总一列数字是不断出现的事情之一。我结束了这个shell函数:

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中添加“ -h”选项,以获取Gig中的输出。然后,您不必计数数字等。我只是对一堆大小约为1188800 KB的文件进行了测试。那有多大 没关系,du -ch --files0-from=-告诉我我的总数是“ 9.0G”。甜!
Mike S

香甜,很好用的杜!
haridsv

另外,如果您只对总数感兴趣,则将du管道输出到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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.