it-swarm.dev

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

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

71
Daryl Spitzer

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

Aquí hay un ejemplo.

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

$ du -s
248   .

El indicador -h 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 find y awk para obtener 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 reportado por la ventana Obtener información del buscador. (No hay forks o xattrs extraños en este conjunto de archivos). Es significativamente menor que el valor reportado por du.

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

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

79
wch

Mostrar el tamaño de un solo archivo.

du -h path_to_a_file

Muestre el tamaño del contenido 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

75
Daryl Spitzer

du - indica al uso de disco no al tamaño de archivo .

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

el código de terminal anterior (im en osx 10.6) ofrece el mejor resultado y es más rápido que "encontrar ... -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
9
Acid

Puede usar du -ah . que muestra 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 -h para sort no está disponible en OSX/BSD, por lo que debe instalar sort desde coreutils (por ejemplo, a través de brew) y aplicar la ruta de ubicación a PATH, por ejemplo.

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

De lo contrario, utilice:

du -a . | sort -rn | head -20
5
kenorb

Combiné todos sus datos 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 Gist: https://Gist.github.com/mlegenhausen/9365461

2
malte