Soluzione 1:
Credo che qualcosa del genere funzionerebbe in busybox:
du `cat filelist.txt` | awk '{i+=$1} END {print i}'
Non ho il tuo stesso ambiente, ma se riscontri problemi con gli spazi nei nomi dei file, funzionerebbe anche qualcosa del genere:
cat filelist.txt | while read file;do
du "$file"
done | awk '{i+=$1} END {print i}'
Modifica 1 :
@stew ha ragione nel suo post qui sotto, du mostra l'utilizzo del disco e non la dimensione esatta del file. Per cambiare il comportamento busybox usa il flag -a, quindi prova:du -a "$file"
per la dimensione esatta del file e confronta l'output/comportamento.
Soluzione 2:
du -c `cat filelist.txt` | tail -1 | cut -f 1
-c
aggiunge la riga "dimensione totale";
tail -1
prende l'ultima riga (con dimensione totale);
cut -f 1
elimina la parola "totale".
Soluzione 3:
Non so se i tuoi strumenti Linux sono in grado di farlo, ma:
cat /tmp/filelist.txt |xargs -d \\n du -c
Fallo, xargs imposterà il delimitatore in modo che sia un carattere di nuova riga e du produrrà un totale complessivo per te.
Guardando http://busybox.net/downloads/BusyBox.html sembra che "busybox du" supporterà l'opzione totale generale, ma "busybox xargs" non supporterà i delimitatori personalizzati.
Di nuovo, non sono sicuro del tuo set di strumenti.
Soluzione 4:
while read filename ; do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'
Questo è simile alla soluzione di Mattias Ahnberg. L'uso di "read" risolve i problemi con nomi di file/directory con spazi. Uso stat
invece di du
per ottenere la dimensione del file. du sta ottenendo la quantità di spazio che sta utilizzando su disco anziché la dimensione del file, che potrebbe essere diversa. A seconda del tuo filesystem, un file da 1 byte occuperà comunque 4k su disco (o qualunque sia la dimensione del blocco). Quindi, per un file da 1 byte, stat dice 1 byte e du dice 4k.
Soluzione 5:
Ecco un'altra soluzione al problema:
cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-