Tamaño total del contenido de todos los archivos en un directorio [cerrado]

103

Cuando utilizo lso du, obtengo la cantidad de espacio en disco que ocupa cada archivo.

Necesito la suma total de todos los datos en archivos y subdirectorios que obtendría si abriera cada archivo y contara los bytes. Puntos de bonificación si puedo obtener esto sin abrir cada archivo y contar.

Arthur Ulfeldt
fuente
1
lsen realidad muestra el número de bytes en cada archivo, no la cantidad de espacio en disco. ¿Es esto suficiente para sus necesidades?
Greg Hewgill
3
Tenga en cuenta que duno se puede utilizar para responder a esta pregunta. Muestra la cantidad de espacio en disco que ocupa el directorio en el disco (los datos de los archivos más el tamaño de la metainformación del sistema de archivos auxiliar). La dusalida puede ser incluso menor que el tamaño total de todos los archivos. Esto puede suceder si el sistema de archivos puede almacenar datos comprimidos en el disco o si se utilizan vínculos físicos. Las respuestas correctas se basan en lsy find. Vea las respuestas de Nelson y bytepan aquí, o esta respuesta: unix.stackexchange.com/a/471061/152606
anton_rh

Respuestas:

108

Si desea el 'tamaño aparente' (que es el número de bytes en cada archivo), no el tamaño que ocupan los archivos en el disco, use la opción -bo --bytes(si tiene un sistema Linux con GNU coreutils ):

% du -sbh <directory>
Arkady
fuente
1
funciona en mis cajas de sombrero rojo más nuevas, desafortunadamente no en mi caja de desarrollo integrada.
Arthur Ulfeldt
3
¿Existe una manera fácil de mostrar el "tamaño aparente" en un formato legible por humanos? Cuando se usa du -shb(como sugiere esta respuesta), la -bconfiguración parece anular la -hconfiguración.
Mathias Bynens
6
@MathiasBynens Invierta el orden de las banderas (es decir, du -sbh <dir>). Funciona para mi.
Luis E.
2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi
2
@Arkady Probé su solución en CentOS y Ubuntu, y hay un pequeño error. Quieres "du -sbh". La bandera "-h" debe ser la última.
theJollySin
46

Utilizar du -sb:

du -sb DIR

Opcionalmente, agregue la hopción para una salida más fácil de usar:

du -sbh DIR
robar
fuente
4
-b parece ser una opción ilegal para MacOS 'du
lynxoid
3
@lynxoid: Puede instalar la versión de GNU con cerveza: brew install coreutils. Estará disponible como comando gdu.
neu242
1
No funciona. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Definitivamente no es el tamaño total del contenido, sino el tamaño que ocupa el directorio en el disco.
anton_rh
24

cd al directorio, luego:

du -sh

ftw!

Originalmente escribí sobre esto aquí: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

AO_
fuente
1
¡Esto es simple y funciona! Gracias. A veces, me gusta agregar la -Lopción para duseguir los enlaces simbólicos.
conradkleinespel
2
funciona para mí (en OS X)
sam boosalis
2
Esto es simple y no funciona. Imprime el espacio que ocupa ese directorio en el disco, no el tamaño total del contenido que podría calcularse abriendo cada archivo y contando los bytes.
anton_rh
17

Solo una alternativa:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' excluirá los directorios.

Barun
fuente
4
Perfecto, también agregue el parámetro -a para obtener "archivos ocultos" (cualquier cosa que comience con un punto)
Nicholi
Aislado a un tipo de archivo específico (en este caso, PNG) y expresado en MB para mayor legibilidad: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice
Es una respuesta correcta. A diferencia de duesta solución, realmente cuenta el tamaño total de todos los datos en los archivos como si se abrieran uno por uno y se contaran sus bytes. Pero sí, también -Aes necesario agregar el parámetro para contar los archivos ocultos.
anton_rh
13

El formato "% s" de stat le da el número real de bytes en un archivo.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

No dude en sustituir su método favorito para sumar números .

Nelson
fuente
4
Preferiblemente use "find. -Type f -print0 | xargs -0 ..." para evitar problemas con ciertos nombres de archivos (que contienen espacios, etc.).
hlovdal
1
sí, buen punto. si no estaba en bsd 4.2, no recuerdo usarlo :-(
Nelson
3
find -print0y xargs -0son necesarios para nombres de archivo con espacios. OS X quiere stat -f %z.
Kornel
1
(Tenga en cuenta que stat funciona con archivos dispersos, informando el tamaño nominal grande del archivo y no los bloques más pequeños utilizados en duinformes como discos ).
Nelson
1
A diferencia de muchas otras respuestas aquí que utilizan erróneamente la duutilidad, esta respuesta es correcta. Es muy similar a responder aquí: unix.stackexchange.com/a/471061/152606 . Pero también usaría en ! -type dlugar de -type fcontar los enlaces simbólicos (el tamaño del enlace simbólico en sí (generalmente unos pocos bytes), no el tamaño del archivo al que apunta).
anton_rh
3

Si usa "du" de busybox en el sistema emebedded, no puede obtener un byte exacto con du, solo puede obtener Kbytes.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
Sam Liao
fuente
3

Cuando se crea una carpeta, muchos sistemas de archivos Linux asignan 4096 bytes para almacenar algunos metadatos sobre el directorio en sí. Este espacio aumenta en un múltiplo de 4096 bytes a medida que crece el directorio.

du command (con o sin la opción -b) tome en cuenta este espacio , como puede ver escribiendo:

mkdir test && du -b test

tendrá un resultado de 4096 bytes para un directorio vacío. Entonces, si coloca 2 archivos de 10000 bytes dentro del directorio, la cantidad total dada por du -sb sería 24096 bytes.

Si lee atentamente la pregunta, esto no es lo que se preguntó. El interrogador preguntó:

la suma total de todos los datos en archivos y subdirectorios que obtendría si abriera cada archivo y contara los bytes

que en el ejemplo anterior debería ser 20000 bytes, no 24096.

Entonces, la respuesta correcta en mi humilde opinión podría ser una combinación de la respuesta de Nelson y la sugerencia de hlovdal para manejar nombres de archivos que contienen espacios:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
bytepan
fuente
2

Hay al menos tres formas de obtener la "suma total de todos los datos en archivos y subdirectorios" en bytes que funcionan tanto en Linux / Unix como en Git Bash para Windows, enumerados a continuación en orden de más rápido a más lento en promedio. Para su referencia, se ejecutaron en la raíz de un sistema de archivos bastante profundo ( docrooten una instalación de Magento 2 Enterprise que comprende 71,158 archivos en 30,027 directorios).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Estos dos también funcionan, pero se basan en comandos que no existen en Git Bash para Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Si sólo desea que el total para el directorio actual, a continuación, añadir -maxdepth 1a find.


Tenga en cuenta que algunas de las soluciones sugeridas no devuelven resultados precisos, por lo que me quedaría con las soluciones anteriores.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
thdoan
fuente
1
Con respecto a Git Bash para Windows, en el caso de Cygwin, dces parte del bcpaquete, por lo que para obtenerlodc es necesario instalarlo bc.
ruvim
1

Para Win32 DOS, puede:

c:> dir / sc: \ directorio \ que \ desea

y la penúltima línea le dirá cuántos bytes ocupan los archivos.

Sé que lee todos los archivos y directorios, pero funciona más rápido en algunas situaciones.

Dom
fuente
1

dues útil, pero findes útil en caso de que desee calcular el tamaño de algunos archivos solamente (por ejemplo, usando el filtro por extensión). También tenga en cuenta que findellos mismos pueden imprimir el tamaño de cada archivo en bytes. Para calcular un tamaño total podemos conectar el dccomando de la siguiente manera:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Aquí findgenera una secuencia de comandos para me dcgusta 123 + 456 + 11 +. Aunque, el programa completo debería ser como 0 123 + 456 + 11 + p(recuerde la notación de sufijo).

Entonces, para obtener el programa completo, debemos colocarlo 0en la pila antes de ejecutar la secuencia desde stdin e imprimir el número superior después de ejecutar (el pcomando al final). Lo logramos a través de dcopciones:

  1. -e0es solo un atajo -e '0'que pone 0en la pila,
  2. -f-es para leer y ejecutar comandos desde stdin (el generado findaquí),
  3. -epes para imprimir el resultado ( -e 'p').

Para imprimir el tamaño en MiB como 284.06 MiBpodemos usar -e '2 k 1024 / 1024 / n [ MiB] p'en el punto 3 (la mayoría de los espacios son opcionales).

ruvim
fuente
1

Esto puede ayudar:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

El comando anterior sumará todos los archivos que salen del tamaño de los directorios.

Ataul Haque
fuente
1
Tenga en cuenta que esta solución es muy similar a la respuesta de Barun. Pero esta solución no suma archivos en subdirectorios.
ruvim
1
@ruvim, tampoco suma archivos ocultos. Para sumar archivos ocultos, se -Adebe agregar la opción a ls.
anton_rh
0

Utilizar:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Donde <DIR> es el directorio que desea inspeccionar.

El '-c' le da datos totales que se extraen usando la porción 'grep total' del comando, y el recuento en Kbytes se extrae con el comando awk.

La única advertencia aquí es que si tiene un subdirectorio que contiene el texto "total", también se escupirá.

Rob Jones
fuente