给定files.txt中的文件列表,我可以得到它们的大小列表,如下所示:
cat files.txt | xargs ls -l | cut -c 23-30
这会产生这样的结果:
151552
319488
1536000
225280
我怎样才能得到所有这些数字的总数呢?
给定files.txt中的文件列表,我可以得到它们的大小列表,如下所示:
cat files.txt | xargs ls -l | cut -c 23-30
这会产生这样的结果:
151552
319488
1536000
225280
我怎样才能得到所有这些数字的总数呢?
当前回答
sizes=( $(cat files.txt | xargs ls -l | cut -c 23-30) )
total=$(( $(IFS="+"; echo "${sizes[*]}") ))
或者你可以一边看大小一边把它们加起来
declare -i total=0
while read x; total+=x; done < <( cat files.txt | xargs ls -l | cut -c 23-30 )
如果你不关心咬的大小和块是可以的,那么
declare -i total=0
while read s junk; total+=s; done < <( cat files.txt | xargs ls -s )
其他回答
这里是我的
cat files.txt | xargs ls -l | cut -c 23-30 | sed -e :a -e '$!N;s/\n/+/;ta' | bc
这里是
cat files.txt | xargs ls -l | cut -c 23-30 |
awk '{total = total + $1}END{print total}'
... |xargs|tr \ +|bc
... |paste -sd+ -|bc
第一个命令只是多了一个符号(注意,它必须在反斜杠后面有两个空格!),但它处理列中有空行的情况,而第二个命令导致带有额外加号的无效表达式。
例如:
echo "2
3
5
" | paste -sd+ -
结果
2+3+5++
哪个BC不能处理,而
echo "2
3
5
" | xargs | tr \ +
给出一个有效表达式
2+3+5
哪些可以被导入BC以获得最终结果
打印ksh:
echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc
在我看来,最简单的解决方案是"expr" unix命令:
s=0;
for i in `cat files.txt | xargs ls -l | cut -c 23-30`
do
s=`expr $s + $i`
done
echo $s