Solución 1:
Creo que algo como esto funcionaría en busybox:
du `cat filelist.txt` | awk '{i+=$1} END {print i}'
No tengo el mismo entorno que usted, pero si tiene problemas con los espacios en los nombres de archivo, algo como esto también funcionaría:
cat filelist.txt | while read file;do
du "$file"
done | awk '{i+=$1} END {print i}'
Editar 1 :
@stew tiene razón en su publicación a continuación, du muestra el uso del disco y no el tamaño de archivo exacto. Para cambiar el comportamiento, busybox usa el indicador -a, así que intente:du -a "$file"
para el tamaño de archivo exacto y compare la salida/comportamiento.
Solución 2:
du -c `cat filelist.txt` | tail -1 | cut -f 1
-c
agrega la línea "tamaño total";
tail -1
toma la última línea (con el tamaño total);
cut -f 1
corta la palabra "total".
Solución 3:
No sé si sus herramientas de Linux son capaces de esto, pero:
cat /tmp/filelist.txt |xargs -d \\n du -c
Do, los xargs configurarán el delimitador para que sea un carácter de nueva línea y du generará un total general para usted.
Al mirar http://busybox.net/downloads/BusyBox.html, parece que "busybox du" admitirá la opción total general, pero "busybox xargs" no admitirá delimitadores personalizados.
Nuevamente, no estoy seguro de su conjunto de herramientas.
Solución 4:
while read filename ; do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'
Esto es similar a la solución de Mattias Ahnberg. El uso de "leer" soluciona los problemas con los nombres de archivo/directorios con espacios. Yo uso stat
en lugar de du
para obtener el tamaño del archivo. du está obteniendo la cantidad de espacio que está usando en el disco en lugar del tamaño del archivo, que podría ser diferente. Dependiendo de su sistema de archivos, un archivo de 1 byte aún ocupará 4k en el disco (o cualquiera que sea el tamaño del bloque). Entonces, para un archivo de 1 byte, stat dice 1 byte y du dice 4k.
Solución 5:
Aquí hay otra solución al problema:
cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-