Lösung 1:
Ich glaube, so etwas würde in busybox funktionieren:
du `cat filelist.txt` | awk '{i+=$1} END {print i}'
Ich habe nicht die gleiche Umgebung wie Sie, aber wenn Sie Probleme mit Leerzeichen in Dateinamen haben, würde so etwas auch funktionieren:
cat filelist.txt | while read file;do
du "$file"
done | awk '{i+=$1} END {print i}'
Bearbeiten 1 :
@stew steht direkt in seinem Beitrag unten, du zeigt die Festplattennutzung und nicht die genaue Dateigröße. Um das Verhalten zu ändern, verwendet busybox das Flag -a, also versuchen Sie es mit:du -a "$file"
für die genaue Dateigröße und vergleichen Sie die Ausgabe/das Verhalten.
Lösung 2:
du -c `cat filelist.txt` | tail -1 | cut -f 1
-c
fügt Zeile "Gesamtgröße" hinzu;
tail -1
nimmt letzte Zeile (mit Gesamtgröße);
cut -f 1
schneidet das Wort "total" aus.
Lösung 3:
Ich weiß nicht, ob Ihre Linux-Tools dazu in der Lage sind, aber:
cat /tmp/filelist.txt |xargs -d \\n du -c
Do, xargs setzt das Trennzeichen auf ein Zeilenumbruchzeichen, und du erzeugt eine Gesamtsumme für Sie.
Wenn Sie sich http://busybox.net/downloads/BusyBox.html ansehen, scheint es, dass "busybox du" die Gesamtsummenoption unterstützt, aber "busybox xargs" keine benutzerdefinierten Trennzeichen unterstützt.
Auch hier bin ich mir Ihres Toolsets nicht sicher.
Lösung 4:
while read filename ; do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'
Dies ähnelt der Lösung von Mattias Ahnberg. Die Verwendung von "read" umgeht Probleme mit Dateinamen/Verzeichnissen mit Leerzeichen. Ich verwende stat
statt du
um die Dateigröße zu erhalten. du erhält die Menge an Speicherplatz, die es auf der Festplatte verwendet, anstelle der Dateigröße, die unterschiedlich sein kann. Abhängig von Ihrem Dateisystem belegt eine 1-Byte-Datei immer noch 4 KB auf der Festplatte (oder was auch immer die Blockgröße ist). Für eine 1-Byte-Datei sagt stat also 1 Byte und du sagt 4k.
Lösung 5:
Hier ist eine weitere Lösung für das Problem:
cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-