给定files.txt中的文件列表,我可以得到它们的大小列表,如下所示:

cat files.txt | xargs ls -l | cut -c 23-30

这会产生这样的结果:

  151552
  319488
 1536000
  225280

我怎样才能得到所有这些数字的总数呢?


当前回答

cat files.txt | awk '{ total += $1} END {print total}'

您可以使用awk来做同样的事情,它甚至会跳过非整数

$ cat files.txt
1
2.3
3.4
ew
1

$ cat files.txt | awk '{ total += $1} END {print total}'
7.7

或者您可以使用ls命令并计算人类可读的输出

$ ls -l | awk '{ sum += $5} END  {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
15.69 Mb

$ ls -l *.txt | awk '{ sum += $5} END  {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
2.10 Mb

其他回答

如果你只想使用shell脚本而不使用awk或其他解释器,你可以使用下面的脚本:

#!/bin/bash

total=0

for number in `cat files.txt | xargs ls -l | cut -c 23-30`; do
   let total=$total+$number
done

echo $total

我会用“du”来代替。

$ cat files.txt | xargs du -c | tail -1
4480    total

如果你只想要数字:

cat files.txt | xargs du -c | tail -1 | awk '{print $1}'

TMTWWTDI: Perl有一个文件大小操作符(-s)

perl -lne '$t+=-s;END{print $t}' files.txt

我喜欢使用....

echo "
1
2
3 " | sed -e 's,$, + p,g' | dc 

它们会显示每一行的和…

适用于这种情况:

ls -ld $(< file.txt) | awk '{print $5}' | sed -e 's,$, + p,g' | dc 

Total是最后一个值…

打印ksh:

echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc