在文件列表上使用awk的文件大小总和

时间:2014-01-16 09:24:57

标签: bash awk

我有一个文件列表,想要总结一下他们的文件大小。 所以,我创建了一个(全局)变量作为计数器,并试图循环该列表,使用ls获取文件大小并使用

添加它
export COUNTER=1
for x in $(cat ./myfiles.lst); do ls -all $x | awk '{COUNTER+=$5}'; done

但是,我的柜台是空的?

> echo $COUNTER
> 1

有人对我有所了解,我在这里缺少什么?

干杯谢谢,   托马斯


好的,我找到了将awk管道的结果传递给变量的方法 (这可能不优雅,但工作;))

for x in $(cat ./myfiles.lst); do a=$(ls -all $x |awk '{print $5}'); COUNTER=$(($COUNTER+$a)) ; done

> echo $COUNTER
> 4793061514

3 个答案:

答案 0 :(得分:3)

因为你做错了。每个文件都会调用awk,因此在COUNTER中你得到了最后一个文件的大小。

更好的解决方案是:

ls -all <myfiles.lst | awk '{COUNTER+=$5} END {print COUNTER}'

但是你在这里重新发明轮子。你可以做点什么

du -s <myfiles.lst 

(如果您已安装du注意:请参阅下面有关du的答案的评论。我已使用cygwin对其进行了测试像魅力一样工作。)

答案 1 :(得分:1)

最后一个版本的缩短版:

ls -l | awk '{sum += $5} END {print sum}'

现在,假设您要按某些类型的文件,年龄等进行过滤...只需将ls -l抛出到find中,您就可以使用find的扩展过滤器参数进行过滤:

find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'

答案 2 :(得分:0)

ls -ltS | awk -F " " {'print $5'} | awk '{s+=$1} END {print s}'