GNU/Linux >> Linux Esercitazione >  >> Linux

Ottieni la dimensione totale dei file da un file contenente un elenco di file

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=-

Linux
  1. Lum:unire colonne da due file separati?

  2. Ottieni l'elenco di tutti i file per maschera nel terminale?

  3. Come visualizzare le dimensioni/i dettagli del file dal comando ls in Unix

  4. Modo portatile per ottenere la dimensione del file (in byte) nella shell?

  5. Come ottenere la dimensione di tar.gz nel file (MB) in python

Comando Ls in Linux (Elenca file e directory)

Come elencare tutti i file ordinati per dimensione in Linux?

Elenca le dimensioni totali di utilizzo del disco dei file per directory/cartelle in Linux

Come distinguere il binario dai file di testo in Linux

Itera su un elenco di file con spazi

Trova la dimensione totale dei file senza commit o non tracciati in git