Solution 1 :
Je crois que quelque chose comme ça fonctionnerait dans busybox :
du `cat filelist.txt` | awk '{i+=$1} END {print i}'
Je n'ai pas le même environnement que vous, mais si vous rencontrez des problèmes avec des espaces dans les noms de fichiers, quelque chose comme ça fonctionnerait aussi :
cat filelist.txt | while read file;do
du "$file"
done | awk '{i+=$1} END {print i}'
Modifier 1 :
@stew est juste dans son message ci-dessous, du montre l'utilisation du disque et non la taille exacte du fichier. Pour changer le comportement, busybox utilise le drapeau -a, alors essayez :du -a "$file"
pour la taille de fichier exacte et comparez la sortie/le comportement.
Solution 2 :
du -c `cat filelist.txt` | tail -1 | cut -f 1
-c
ajoute la ligne "taille totale" ;
tail -1
prend la dernière ligne (avec la taille totale);
cut -f 1
découpe le mot "total".
Solution 3 :
Je ne sais pas si vos outils Linux sont capables de cela, mais :
cat /tmp/filelist.txt |xargs -d \\n du -c
Faites, les xargs définiront le délimiteur comme un caractère de saut de ligne, et du produira un grand total pour vous.
En regardant http://busybox.net/downloads/BusyBox.html, il semble que "busybox du" prendra en charge l'option grand total, mais le "busybox xargs" ne prendra pas en charge les délimiteurs personnalisés.
Encore une fois, je ne suis pas sûr de votre ensemble d'outils.
Solution 4 :
while read filename ; do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'
Ceci est similaire à la solution de Mattias Ahnberg. L'utilisation de "read" contourne les problèmes avec les noms de fichiers/répertoires avec des espaces. J'utilise stat
au lieu de du
pour obtenir la taille du fichier. du obtient la quantité d'espace qu'il utilise sur le disque au lieu de la taille du fichier, qui peut être différente. Selon votre système de fichiers, un fichier de 1 octet occupera toujours 4 Ko sur le disque (ou quelle que soit la taille de bloc). Donc, pour un fichier de 1 octet, stat dit 1 octet et du dit 4k.
Solution 5 :
Voici une autre solution au problème :
cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-