Berechnen Sie die Summe mehrerer Dateigrößen in Bash

Berechnen Sie die Summe mehrerer Dateigrößen in Bash

Ich habe eine Liste von Dateien in einer Datei cache_temp.

Im Ordner 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

Ich habe ein einfaches Skript zum Ermitteln der Dateigröße von 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

Ich habe eine Liste mit Dateigrößen:

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

Wie kann ich die Summe davon berechnen?

Antwort1

Verwenden Sie statstattdessen 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

Antwort2

Laut du(1) gibt es eine Option -c, deren Zweck es ist, die Gesamtsumme zu ermitteln.

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

Antwort3

Wenn Sie die Datei verwenden müssen, ist dieser Codeausschnitt hoffentlich hilfreich.

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

Dies xargsdient dazu, ein Überschreiten des Argumentlimits zu verhindern und gleichzeitig die maximale Anzahl an Dateien bei einem Aufruf jedes statMal zu erreichen.

Antwort4

Nun ... Ob gut oder schlecht, hier ist meine Implementierung davon. Ich habe es immer vorgezogen, „while“ zu verwenden, um Zeilen aus Dateien zu lesen.

#!/bin/bash

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

Gemäß Janos‘ Empfehlung unten:

#!/bin/bash

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

verwandte Informationen