>我有一个文件列表,想要对它们的文件大小求和。因此,我创建了一个(全局)变量作为计数器,并尝试遍历该列表,使用 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
文件都会调用awk
,因此在COUNTER
中,您得到了最后一个文件的大小。
更好的解决方案是:
ls -all <myfiles.lst | awk '{COUNTER+=$5} END {print COUNTER}'
但是你在这里重新发明了轮子。你可以做类似的事情
du -s <myfiles.lst
(如果已安装du
。注意:请参阅我关于du
的回答下面的评论。我已经用cygwin
对此进行了测试,并且它就像一个魅力。
最后一个的简短版本:
ls -l | awk '{sum += $5} END {print sum}'
现在,假设您想按某些类型的文件、年龄等进行过滤......只需将 ls -l 放入查找中,您就可以使用 find 的广泛过滤器参数进行过滤:
find . -type f -exec ls -l {} ; | awk '{sum += $5} END {print sum}'
ls -ltS | awk -F " " {'print $5'} | awk '{s+=$1} END {print s}'