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

mun*_*ish 21 ksh hp-ux shell-script

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

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
Run Code Online (Sandbox Code Playgroud)

等等。

现在我想通过总结第 5 列来计算这些文件的总大小。我想使用awk, 来做到这一点,所以我在特定目录中测试了以下内容

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched
Run Code Online (Sandbox Code Playgroud)

我不明白有什么问题,为什么这个语法错误

我想试试

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

这也是,但一个简单的awk脚本不起作用。

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

enz*_*tib 28

首先,您应该使用直单引号 ( '),而不是斜引号( `)。

awk内嵌脚本可能如下:

ls -lrt | awk '{ total += $5 }; END { print total }'
Run Code Online (Sandbox Code Playgroud)

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


cam*_*amh 16

@enzotib 已经指出您的语法错误是什么 - 我将有点切线。

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

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您的解决方案就变成了:

ls -lrt | sumcol 5
Run Code Online (Sandbox Code Playgroud)

这将对第 5 列中的数字求和并打印该值。


tux*_*xce 14

这是使用以下方法执行此操作的另一种方法du

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
Run Code Online (Sandbox Code Playgroud)


man*_*ork 5

如果 HP-UXfind也有-printfbc选项,那么编写一个公式来计算将很有用:

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

如果公式太大,可以逐步计算:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
Run Code Online (Sandbox Code Playgroud)