给定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
我怎样才能得到所有这些数字的总数呢?
当前回答
如果您没有安装BC,请尝试
echo $(( $(... | paste -sd+ -) ))
而不是
... | paste -sd+ - | bc
$() <——返回执行命令的值
$((1+2)) <——返回求值结果
Echo <——将它回显到屏幕
其他回答
管呆了:
cat files.txt | xargs ls -l | cut -c 23-30 | gawk 'BEGIN { sum = 0 } // { sum = sum + $0 } END { print sum }'
如果你只想使用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
我发现自己会用jq来做这样的事情,即使不使用JSON:
$ echo -e '1\n2\n3' | jq --slurp add
6
它已经成为我最近编写的几乎每个脚本的标准依赖项。
如果文件名中有空格,Cat将不起作用。下面是一个perl单行程序。
perl -nle 'chomp; $x+=(stat($_))[7]; END{print $x}' files.txt
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 )