在 Bash 中计算多个文件大小的总和

在 Bash 中计算多个文件大小的总和

我有一个文件中的文件列表cache_temp

在文件中cache_temp

/home/maildir/mydomain.com/een/new/1491397868.M395935P76076.nm1.mydomain.com,S=1740,W=1777
/home/maildir/mydomain.com/een/new/1485873821.M199286P14170.nm1.mydomain.com,S=440734,W=446889
/home/maildir/mydomain.com/td.pr/cur/1491397869.M704928P76257.nm1.mydomain.com,S=1742,W=1779:2,Sb
/home/maildir/mydomain.com/td.pr/cur/1501571359.M552218P73116.nm1.mydomain.com,S=1687,W=1719:2,Sa
/home/maildir/mydomain.com/td.pr/cur/1498562257.M153946P22434.nm1.mydomain.com,S=1684,W=1717:2,Sb

我有一个简单的脚本,用于获取文件大小cache_temp

#!/bin/bash

for i in `grep -v ^# ~/cache_temp | grep -v "dovecot.index.cache"`; do
    if [ -f "$i" ]; then
        size=$(du -sh "$i" | awk '{print $1}')
        echo $size
    fi
done

我有一个文件大小列表:

4,0K
4,0K
4,0K
432K
4,0K

我怎样才能计算它们的总和?

答案1

使用stat而不是du

#!/bin/bash

for i in `grep -v ^# ~/cache_temp | grep -v "dovecot.index.cache"`; do
     [ -f "$i" ] && totalsize=$[totalsize + $(stat -c "%s" "$i")]
done
echo totalsize: $totalsize bytes

答案2

根据 du(1),有一个 -c 选项,其目的是计算总计。

% du -chs * /etc/passwd
92K ABOUT-NLS
196K    NEWS
12K README
48K THANKS
8,0K    TODO
4,0K    /etc/passwd
360K    total

答案3

如果您需要使用该文件,希望此代码片段是有效的。

xargs -a cache_file stat --format="%s" | paste -sd+ | bc -l

xargs是为了防止溢出参数限制,但stat每次调用时都会获取最大数量的文件。

答案4

好吧...不管怎样,这是我的实现。我一直更喜欢使用“while”从文件中读取行。

#!/bin/bash

SUM=0
while read file; do
    SUM=$(( $SUM + $(stat $file | awk '/Size:/ { print $2 }') ))
done < cache_temp
echo $SUM

根据 janos 的建议如下:

#!/bin/bash

while read file; do
    stat $file
done < cache_temp | awk 'BEGIN { s=0 } $1 == "Size:" { s=s+$2 } END  { print s; }'

相关内容