¿Cómo puedo obtener 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?
¿Qué comando utilizo para encontrar el tamaño de todos los archivos (recursivamente) en un directorio de Linux o Mac OS X?
La versión BSD de du
utilizada en OS X informa del 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.
He aquí un ejemplo.
Este es el valor con regularidad du
. Está en bloques de 512 bytes:
$ du -s
248 .
La bandera -h
da como resultado un número más legible, en kilobytes. Como era de esperar, es la mitad del número de bloques de 512 bytes:
$ du -hs
124K .
Por último, puede utilizar 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 Get Info de Finder. (No hay bifurcaciones extrañas o xattrs 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
; luego se usa awk
para contar los bytes. La bandera -type f
está ahí para que sólo los archivos (y no los directorios) sean enviados a ls
. Sin esa bandera, también enviará los nombres de los directorios a ls
, y cada archivo será listado dos veces: una como archivo individual, y otra como elemento del directorio.
La versión GNU de du
puede dar valores en bytes reales en lugar de bloques. Es una pena que la versión BSD de du
no sea tan flexible.
Mostrar el tamaño de un solo archivo
du -h path_to_a_file
Mostrar el tamaño del contenido de un directorio, de cada subdirectorio y de cada archivo individual:
du -h path_to_a_directory
Mostrar el tamaño del contenido de un directorio:
du -sh path_to_a_directory
du - indica el uso del disco no el tamaño del archivo.
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
el código de la terminal de arriba (estoy en osx 10.6) ofrece para mí el mejor resultado y es mucho más rápido que “find … -exec”
una prueba rápida
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
Puede utilizar du -ah .
que muestra los tamaños de todos los archivos y directorios de forma recursiva.
Esto puede combinarse con sort
, de modo que verá los 20 directorios más grandes de la carpeta actual:
du -ah . | sort -rh | head -20
Nota: La opción -h
para sort
no está disponible en OSX/BSD, así que tiene que instalar sort
desde coreutils
(por ejemplo, a través de brew
) y aplicar la ruta de la papelera 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
Combiné todos sus aprouches y lo combiné con una salida legible para 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 al gist: https://gist.github.com/mlegenhausen/9365461