给定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 <——将它回显到屏幕

其他回答

而不是使用cut从ls -l的输出中获取文件大小,你可以直接使用:

$ cat files.txt | xargs ls -l | awk '{total += $5} END {print "Total:", total, "bytes"}'

Awk将“$5”解释为第五列。这是ls -l中的列,它提供了文件大小。

... | paste -sd+ - | bc

是我找到的最短的一个(来自UNIX命令行博客)。

编辑:增加了-参数的可移植性,谢谢@Dogbert和@Owen。

粘贴不是必需的。只要files.txt包含一个或多个有效文件名,就可以执行以下操作:

<files.txt xargs stat -c %s | paste -sd+ | bc

如果没有文件,Cat不需要插入0。如果没有管道,也许在脚本中更方便,您可以使用:

(xargs -a files.txt stat -c %s || echo 0) | paste -sd+ | bc

我喜欢使用....

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