2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

¿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?

Respuestas (5)

83
83
83
2012-03-18 05:54:47 +0000

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.

75
75
75
2009-08-13 20:01:52 +0000

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

9
9
9
2013-11-11 22:31:48 +0000

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
6
6
6
2015-03-05 14:03:07 +0000

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
2
2
2
2014-03-05 11:30:06 +0000

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

Preguntas relacionadas

6
10
12
7
13