Cómo mostrar solo el tamaño de archivo total de una extensión particular mediante el comando `du`

11

Tengo cientos de archivos pdf y archivos html en un directorio. Y quiero saber el tamaño total de los archivos pdf.

Por comando du -ch /var/foopuedo ver el tamaño total del archivo pero solo necesito la última línea, el tamaño total.

Si el directorio contiene solo archivos pdf, puedo usar la -sopción, pero la opción no se puede usar esta vez.

¿Cómo puedo obtener solo el tamaño total de un tipo de archivo en particular?

hierro y
fuente
¿No puedes usar como du -sh /foo/*.pdf?
bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Respuestas:

10

Con GNU du(es decir, en Linux no integrado o Cygwin), puede usar la --excludeopción para excluir los archivos que no desea hacer coincidir.

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

Si desea hacer coincidir positivamente los *.pdfarchivos, necesitará usar algún otro método para enumerar los archivos, y dual menos mostrará una línea de salida por argumento, más un total general con la opción -c. Puede llamar tailpara eliminar todo menos la última línea, o sed para eliminar la palabra "total" también. Para enumerar los archivos en ese directorio, use comodines en el shell.

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

Si necesita recorrer archivos en subdirectorios también, use findo use un **/patrón si su shell lo admite. Para **/, en bash, primero ejecute shopt -s extglob, y tenga en cuenta que las versiones de bash hasta 4.2 atravesarán enlaces simbólicos a directorios; en zsh, esto funciona fuera de la caja.

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

Una complicación adicional con la versión de búsqueda es que si hay demasiados archivos, findse ejecutará dumás de una vez, para mantenerse por debajo del límite de longitud de la línea de comando. Con el método comodín, obtendrá un error si eso sucede ("límite de longitud de línea de comando excedido"). El siguiente código supone que no tiene ningún nombre de archivo coincidente que contenga una nueva línea.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles 'SO- deja de ser malvado'
fuente
(probablemente no es un problema en la práctica, pero nota que --exclude='*.html'haría que /var/foo/dir.html/foo.pdfno debe ser contado como las exclusiones también afectan a directorios, también, el uso del disco de directorios incluidos /var/fooen sí sería contabilizado)
Stéphane Chazelas
3

Puede dejar que el shell expanda los archivos:

$ 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

Sin embargo, como puede ver, esto genera tamaños de archivo aproximadamente 1000 veces como se acaba de crear. Una mejor opción es usar la -bopción:

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

Los archivos de gran tamaño aún se mostrarán en forma legible para humanos, por ejemplo 173K.

Anthon
fuente
dumuestra el uso del disco de cada archivo (en la mayoría de los sistemas de archivos, ese es el tamaño del archivo redondeado al siguiente múltiplo del tamaño del bloque). Con la opción -b, dumuestra el tamaño de cada archivo.
Gilles 'SO- deja de ser malvado'