Come mostrare solo la dimensione totale del file di una determinata estensione con il comando `du`


11

Ho centinaia di file pdf e file html in una directory. E voglio sapere la dimensione totale dei file pdf.

Al comando du -ch /var/fooposso vedere la dimensione totale del file ma ho solo bisogno dell'ultima riga, la dimensione totale.

Se la directory contiene solo file pdf, posso usare l' -sopzione, ma questa volta questa opzione non può essere utilizzata.

Come posso ottenere solo le dimensioni totali di un determinato tipo di file?


Non puoi usare come du -sh /foo/*.pdf?
Bagavadhar,

2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti,

Risposte:


10

Con GNU du(ovvero su Linux non incorporato o Cygwin), è possibile utilizzare l' --excludeopzione per escludere i file che non si desidera abbinare.

du -s --exclude='*.html' /var/foo

Se desideri abbinare in modo positivo i *.pdffile, dovrai utilizzare un altro metodo per elencare i file e duvisualizzerà almeno una riga di output per argomento, più un totale generale con l'opzione -c. Puoi chiamare tailper rimuovere tutto tranne l'ultima riga, oppure sed per rimuovere anche la parola "totale". Per enumerare i file in quella directory, utilizzare i caratteri jolly nella shell.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Se è necessario attraversare i file anche nelle sottodirectory, utilizzare findo utilizzare un **/modello se la shell lo supporta. Perché **/, in bash, prima esecuzione shopt -s extglobe notare che le versioni bash fino alla 4.2 attraverseranno i collegamenti simbolici alle directory; in zsh, questo funziona fuori dagli schemi.

du -sc /var/foo/**/*.pdf | tail -n1

Un'ulteriore complicazione con la versione di ricerca è che se ci sono troppi file, findverrà eseguito dupiù di una volta, per mantenere il limite di lunghezza della riga di comando. Con il metodo jolly, si verificherà un errore se ciò accade ("limite di lunghezza della riga di comando superato"). Il codice seguente presuppone che non si disponga di un nome file corrispondente contenente una nuova riga.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'

(probabilmente non è un problema in pratica, ma nota che --exclude='*.html'potrebbe /var/foo/dir.html/foo.pdfnon essere conteggiato poiché le esclusioni influiscono anche sull'attraversamento delle directory; inoltre, /var/fooverrà considerato l'utilizzo del disco delle directory incluso se stesso)
Stéphane Chazelas

3

Puoi consentire alla shell di espandere i file:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

Tuttavia, come puoi vedere, questo indica dimensioni del file circa 1000 volte appena create. Un'opzione migliore sta usando l' -bopzione:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

I file di grandi dimensioni verranno comunque visualizzati in forma leggibile dall'uomo, ad es 173K.


dumostra l'utilizzo del disco di ciascun file (sulla maggior parte dei filesystem, questa è la dimensione del file arrotondata al multiplo successivo della dimensione del blocco). Con l'opzione -b, dumostra la dimensione di ciascun file.
Gilles 'SO- smetti di essere malvagio' il
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.