¿Cómo obtengo el tamaño de un directorio Linux o Mac OS X desde la línea de comandos? [duplicar]

74

Esta pregunta ya tiene una respuesta aquí:

¿Qué comando utilizo para encontrar el tamaño de todos los archivos (recursivamente) en un directorio Linux o Mac OS X?

Daryl Spitzer
fuente
2
puede usar la -kopción para usar el tamaño de bloque de 1K-byte
Zoker
Solo quiero recomendar este software gratuito llamado Disk Inventory X. descárguelo aquí derlien.com es fácil de usar para mac osx
Nimitack
En lugar de du, yo uso ncdu, puede encontrar la referencia aquí, remysharp.com/2018/08/23/cli-improved
Alan Dong

Respuestas:

82

La versión BSD de duutilizada en OS X informa el tamaño con bloques de 512 bytes: los tamaños se redondean esencialmente al siguiente valor de 512 bytes. Esto le indica el espacio en el disco, que es mayor que la cantidad de datos. Si tiene muchos archivos pequeños, la diferencia puede ser grande.

Aquí hay un ejemplo.

Este es el valor con regular du. Está en bloques de 512 bytes:

$ du -s
248   .

La -hbandera da como resultado un número más legible, en kilobytes. Como se esperaba, es la mitad del número de bloques de 512 bytes:

$ du -hs
124K  .

Finalmente, puede usar findy awkdarle la suma de bytes reales en los archivos. Esto es un poco lento, pero funciona:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Este valor coincide exactamente con el número informado por la ventana Obtener información de Finder. (No hay bifurcaciones extrañas o xattrs en este conjunto de archivos). Es significativamente menor que el valor informado por du.

Así es como funciona: obtiene una lista de todos los archivos y los pasa a ls -l; entonces awkse usa para contar los bytes. La -type fbandera está ahí para que solo se envíen archivos (y no directorios) ls. Sin ese indicador, también enviará nombres de directorio ls, y cada archivo se mostrará dos veces: una vez como un archivo individual y otra como un elemento en el directorio.

La versión GNU de dupuede dar valores en bytes reales en lugar de bloques. Es lamentable que la versión BSD de duno sea tan flexible.

wch
fuente
Gran explicación Curiosamente, cuando duutilizo coreutils de GNU con la -bopción, obtengo un resultado diferente que con su findtubería. Para un directorio de 36 GB, obtengo una diferencia de 82 KB.
Stefan Schmidt
¿Hay alguna forma de imprimir esto en un formato más legible para los humanos?
anon58192932
75

Mostrar el tamaño de un solo archivo

du -h path_to_a_file

Muestra el tamaño de los contenidos de un directorio, cada subdirectorio y cada archivo individual:

du -h path_to_a_directory

Mostrar el tamaño de los contenidos de un directorio:

du -sh path_to_a_directory

Daryl Spitzer
fuente
25
du -schsi quieres algo más fácil de leer.
Joey
@Johannes, supongo que deberías publicar este comentario como respuesta, para que pueda ser aceptado.
Arjan
Encuentro la opción -c redundante (al menos en Mac OS X) y du -sh suprime los subtotales.
Daryl Spitzer
Ajá, no sabía que uno pudiera aceptar la propia respuesta. Ahora al menos la gente sabe que la pregunta está resuelta.
Arjan
Felizmente aceptaré una nueva respuesta que es una mejora en la mía.
Daryl Spitzer
9

du : le dice al disco que no use el tamaño del archivo .

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

el código de terminal anterior (estoy en osx 10.6) me ofrece el mejor resultado y es mucho más rápido que "find ... -exec"

un punto de referencia rápido

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
Ácido
fuente
Si quieres hacer lo mismo en Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo
¿Hay alguna manera de obtener este resultado en un formato legible para humanos?
anon58192932
6

Puede usar du -ah .las pantallas que muestran los tamaños de todos los archivos y directorios de forma recursiva.

Esto se puede combinar con sort, por lo que verá los 20 directorios más grandes en la carpeta actual:

du -ah . | sort -rh | head -20

Nota: la opción -hpara sortno está disponible en OSX / BSD, por lo que debe instalar sortdesde coreutils(p. Ej., Vía brew) y aplicar la ruta bin a PATH, p. Ej.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

De lo contrario, use:

du -a . | sort -rn | head -20
kenorb
fuente
El primer comando no funciona en mi macOS 10.12.1 #du -ah. El | sort -rh | head -20 sort: opción no válida - h Intente `sort --help 'para obtener más información.
nucleartux
3
@nucleartux Verifique la nota debajo del comando. Esto funciona en GNU sort que puede instalar en macOS a través de: de lo brew install coreutilscontrario, use el comando de clasificación BSD al final sin -h.
kenorb
2

Combiné todos sus approuches y lo combiné con una salida legible por humanos, el resultado es:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Enlace a la esencia: https://gist.github.com/mlegenhausen/9365461

malta
fuente