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


14

Ho un file contenente un elenco di file che vorrei conoscere la dimensione totale dei file. C'è un comando per farlo?

Il mio sistema operativo è un linux di base (Qnap TS-410).

MODIFICARE:

Alcune righe dal file:

/ share / archive / Bailey Test / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1 versione 1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


Dacci alcune righe di esempio del file.
EEAA

Esempio dal file aggiunto.
Nicolas

È una specie di NAS, giusto? Hai busybox installato?
cjc,

Sì, lo è e penso che sia già installato, perché?
Nicolas

Risposte:


13

Credo che qualcosa del genere funzionerebbe in busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

Non ho lo stesso ambiente come te, ma se riscontri problemi con 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 è proprio nel suo post qui sotto, du mostra l'utilizzo del disco e non l'esatta dimensione del file. Per modificare il comportamento busybox usa il flag -a, quindi prova: du -a "$file"per la dimensione esatta del file e confronta l'output / comportamento.


1
Grazie per l'input, viene restituito il primo comando /usr/bin/du: Argument list too long(quasi 80.000 righe nel mio file). Il tuo secondo comando mi dà solo un prompt una volta premuto Invio, in attesa di qualcosa di più?
Nicolas

Difficile a dirsi con il tuo ambiente. È il normale prompt dei comandi o solo un prompt lampeggiante? Se è quest'ultimo potrebbe essere solo in attesa del risultato, se è un "prompt di input" potrebbe essere che ti sei perso un personaggio? E se è un prompt normale, non lo so, l'ho testato abbastanza accuratamente prima di scriverlo. :(
Mattias Ahnberg,

è un "prompt di input" quando faccio quanto segue cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. grazie mattias
Nicolas

1
Ah! Se metti tutto su una riga hai bisogno di un'altra; in questo modo: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(cioè prima fatto).
Mattias Ahnberg,

Spot on! Ha funzionato perfettamente, evviva! (Anche se avrei potuto capire questo errore da solo)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-caggiunge la riga "dimensione totale";
tail -1prende l'ultima riga (con dimensione totale);
cut -f 1taglia la parola "totale".


Questo fallisce con la lista du - topic troppo a lungo. La mia lista di file è grande. La risposta di seguito con xargs sembra essere la soluzione più semplice.
Syclone0044,

4

Non so se i tuoi strumenti linux sono in grado di farlo, ma:

cat /tmp/filelist.txt  |xargs -d \\n du -c

Sì, gli xarg imposteranno il delimitatore come un personaggio newline 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.

Ancora una volta, non sono sicuro del tuo set di strumenti.


ecco il risultato:xargs: invalid option -- d
Nicolas

Fantastico: lavorare con un linux di NAS di NAS è come un episodio di McGuyver, provare a costruire un aeroplano funzionante con tela, bastoncini e spago.
cjc,

Che ne dici di questo, se hai spazio su un altro computer: copia tutti quei file che ti interessano in qualche altro linux perfettamente funzionante, quindi esegui la soluzione di Stew lì. Farlo potrebbe essere molto più semplice che cercare di capire se busybox è capace di questo genere di cose.
cjc,

1
Penso che la risposta sia la migliore. È conciso ed è molto più veloce delle altre risposte in questo thread.
zymhan,

Buona risposta. Potresti voler uscire dal -cmomento che xargs farà più chiamate duse l'elenco file è abbastanza lungo, producendo diversi dutotali.
qwr

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" aggira i problemi con nomi di file / directory con spazi. Uso statinvece di duottenere le dimensioni del file. du sta ottenendo la quantità di spazio che sta usando sul disco invece della dimensione del file, che potrebbe essere diversa. A seconda del file system, un file da 1 byte occuperà comunque 4k sul disco (o qualunque sia la dimensione del blocco). Quindi per un file da 1 byte, stat dice 1 byte e du dice 4k.


Buon commento su filesize vs disksize!
Mattias Ahnberg,

Commento davvero interessante, purtroppo il mio Linux non conosce il statcomando:stat: command not found
Nicolas

Potresti dover dire "busybox stat".
cjc,

dice stat: applet not foundin questo caso
Nicolas

4

Ecco un'altra soluzione al problema:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

Per me (su Cygwin) du -bccorre molto più veloce.
qwr

2

Prova qualcosa del genere:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

Per gestire correttamente gli spazi nei percorsi:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

grazie per il tuo contributo, sfortunatamente penso che ci sia un problema con gli spazi nelle directory all'interno del mio file che non vengono salvati con un "\". Pertanto si rompe mentre si scorre l'elenco dei file.
Nicolas

Puoi ignorare l'elenco dei file di testo e generarlo appena fuori dall'output di find?
SEE

purtroppo l'elenco è troppo lungo, ci sono 79159 righe di file (percorso completo), ecco perché l'ho prodotto in un file; forse posso aggiungere un argomento su come sfuggire al risultato della ricerca?
Nicolas

non c'è argomento "-print0" con la ricerca sul mio sistema linux
Nicolas

@Nicolas - questo è dovuto al fatto che utilizza lo spazio ridotto di busybox findanziché il vero findbinario.
SEE

1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.