我有一个文件列表在files.txt
中,我可以用以下方法获取它们的大小列表:
cat files.txt | xargs ls -l | cut -c 23-30
它会生成类似于这样的内容:
151552
319488
1536000
225280
如何获取所有这些数字的总和?
这里是内容
cat files.txt | xargs ls -l | cut -c 23-30 |
awk '{total = total + $1}END{print total}'
cut
呢?那是一个可预测的列数,所以可以使用... | xargs ls -l | awk '{total = total + $5}{END{print total}'
。 - dmckee --- ex-moderator kittentotal+=$1
来代替total = total + $1
пјЊиї™ж ·ж›ґз®ЂжґЃгЂ‚ - squirl如果文件名中有空格,那么cat命令将无法正常工作。以下是一个Perl单行命令解决方案。
perl -nle 'chomp; $x+=(stat($_))[7]; END{print $x}' files.txt
-l
选项,chomp;
是不必要的。-l
会自动处理这个。 - undefined不必使用cut从ls -l的输出中获取文件大小,可以直接使用:
$ cat files.txt | xargs ls -l | awk '{total += $5} END {print "Total:", total, "bytes"}'
Awk将"$5"解释为第五列。这是来自ls -l的列,给出了文件大小。
<files.txt xargs stat -c %s | paste -sd+ - | bc
<infile command
和 command <infile
是等价的,而且前者顺序更好。 - Camille Goudeseunepython3 -c"import os; print(sum(os.path.getsize(f) for f in open('files.txt').read().split()))"
或者,如果您只想求和这些数字,请使用管道运算符:
python3 -c"import sys; print(sum(int(x) for x in sys.stdin))"
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
将不再可用。 - Eponymous如果尚未安装bc,请尝试以下命令:
echo $(( $(... | paste -sd+ -) ))
替换为
... | paste -sd+ - | bc
$( )
<-- 执行命令并返回其值
$(( 1+2 ))
<-- 返回计算结果
echo
<-- 在屏幕上输出
cat files.txt | awk '{ total += $1} END {print total}'
$ cat files.txt
1
2.3
3.4
ew
1
$ cat files.txt | awk '{ total += $1} END {print total}'
7.7
$ 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
awk '{ total += $1} END {print total}' files.txt
更快。 - bmvTMTWWTDI: Perl有一个文件大小操作符(-s)
perl -lne '$t+=-s;END{print $t}' files.txt
perl -lne '$t+=-s}{print $t' files.txt
- Kelly Setzer如果你只想使用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
alias sum="paste -sd+ - | bc"
已经加入到shell自动补全中。 - slf. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
- qneill/usr/bin/sum
。请修复这个问题。 - qneillbc
!另一方面,我认为需要符合POSIX标准的awk
。 - squirl| bc
进行调试,并通过视觉检查输出来查找语法错误(它应该是 "a + b + c + ..." 的格式)。 - Todd Owen