¿Cómo obtener los tamaños resumidos de directorios y sus subdirectorios?

273

Digamos que quiero obtener el tamaño de cada directorio de un sistema de archivos Linux. Cuando yo uso ls -la Realmente no consigo el tamaño resumido de las carpetas.

Si yo uso df Obtengo el tamaño de cada sistema de archivos montado, pero eso tampoco me ayuda. Y con du Obtengo el tamaño de cada subdirectorio y el resumen de todo el sistema de archivos.

Pero quiero tener solo el tamaño resumido de cada directorio dentro de la carpeta ROOT del sistema de archivos. ¿Hay algún comando para lograr eso?

2ndkauboy
fuente
los --total La bandera me ayudó. P.ej. du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Respuestas:

385

Esto hace lo que buscas:

du -sh /*

Lo que esto significa:

  • -s para dar sólo el total de cada argumento de línea de comando.
  • -h para los sufijos legibles por humanos como M para megabytes y G para gigabytes (opcional).
  • /* simplemente se expande a todos los directorios (y archivos) en /.

    Nota: los archivos de puntos no están incluidos; correr shopt -s dotglob para incluir esos también.

También es útil la clasificación por tamaño:

du -sh /* | sort -h

Aquí:

  • -h asegura que sort interpreta los sufijos legibles por humanos correctamente.
Thomas
fuente
8
Si tiene directorios de puntos en el directorio raíz, puede usar shopt -s dotglob Incluirlos en el conde.
Philipp
8
Es muy útil, porque es simple y puede ubicar la ruta que desee en lugar de /*, p.ej. ./ para el directorio actual o ./* para cada elemento en el directorio actual.
psur
2
@psur o puedes usar ./*/ para obtener solo subcarpetas y no todos los elementos
relascope
7
Versión ordenada: du -sh /* | sort -h
Vu Anh
2
@ c1phr si tu sort no tiene -h, necesitas dejarlo fuera de du también, de lo contrario la clasificación mezclará kilo / mega / gigabytes. du -s /* | sort -nr.
Thomas
72

A menudo necesito encontrar los directorios más grandes, así que para obtener una lista ordenada que contiene los 20 directorios más grandes, hago esto:

du -m /some/path | sort -nr | head -n 20

En este caso los tamaños serán reportados en megabytes.

Janne Pikkarainen
fuente
10
Aquí hay una forma de hacerlo más legible du -sh / some / path | sort -hr | cabeza -n 20
Xedecimal
6
@Xedecima el problema con el uso de h es que el orden no sabe cómo manejar diferentes tamaños. Por ejemplo, 268K está ordenado por encima de 255M, y ambos están ordenados por encima de 2.7G
chrisan
4
El argumento -h (legible por humanos) en el comando 'ordenar' debería leer estos valores correctamente. Así como la bandera de du-h los exporta. Dependiendo de lo que estés corriendo supongo.
Xedecimal
Funciona en Ubuntu 16.04. Buen consejo.
SDsolar
sudo du -haxt 1G / | sort -hr | cabeza -30
deviant
17

Me gusta usar Ncdu para eso, puede usar el cursor para navegar y profundizar a través de la estructura de directorios que funciona realmente bien.

BuddhaLincoln
fuente
Increíble. Palabras clave: du meet ncurses. Puedes usar b para caer en un shell en el directorio.
Ciro Santilli 新疆改造中心 六四事件 法轮功
10

Las respuestas existentes son muy útiles, tal vez a algunos principiantes (como yo) también les resulte útil.

  1. Bucle muy básico, pero para mí fue un buen comienzo para otras operaciones relacionadas con el tamaño:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Muy similar a la primera respuesta y casi el mismo resultado que 1.), pero me tomó algo de tiempo entender la diferencia de * a ./* si en un subdirectorio:

    du -sh ./*
    
Martin
fuente
6

El seguimiento du La invocación debería funcionar en sistemas BSD:

du -d 1 /
Philipp
fuente
1
Mi du (Ubuntu 10.4) no tiene un -d opción. ¿En qué sistema estás?
Thomas
En mi openSUSE tampoco tiene una opción -d :(
2ndkauboy
OK, entonces es solo una opción BSD (estoy en OS X).
Philipp
La combinación de opciones portátil correcta en BSD / * NIX es du -sk /*. Odio el -k cosas tan mucho Linux -h totalmente rocas
Dummy00001
en otros sistemas, su --max-depth
Vishnu Kumar
4

Esto no es facil los du el comando muestra archivos y carpetas (predeterminado) o solo los tamaños de todos los elementos que especifique en la línea de comandos (opción -s ).

Para obtener los elementos más grandes (archivos y carpetas), ordenados, con tamaños legibles por humanos en Linux:

du -h | sort -h

Esto te enterrará en una tonelada de pequeños archivos. Puedes deshacerte de ellos con --threshold (1 MB en mi ejemplo):

du --threshold=1M -h | sort -h

La ventaja de este comando es que incluye carpetas de puntos ocultos (carpetas que comienzan con . ).

Si realmente solo quieres las carpetas, necesitas usar find pero esto puede ser muy, muy lento ya que du Habrá que escanear muchas carpetas varias veces:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Aaron Digulla
fuente
1
--threshold ^^^ esta opción no está disponible en Linux
podarok
1
@podarok Está disponible en OpenSUSE 13.2 Linux. Intente encontrar una versión más reciente de su distribución o compile una versión más reciente del paquete.
Aaron Digulla
No funciona en Ubuntu LTS (14.04). Es el más reciente))
podarok
@podarok ¿Qué versión de GNU coreutils? El mío es 8.24.
Aaron Digulla
1
Cachear podría haber sido un mal término. Estaba pensando en algo como hecho en este puerto. superusuario.com/a/597173/121352 donde escaneamos el contenido de los discos una vez en una asignación y luego continuamos usando los datos de esa asignación en lugar de golpear el disco nuevamente.
Hennes
1

Ten en cuenta que no puedes comparar directorios con du En diferentes sistemas / máquinas sin estar seguros, ambos comparten el mismo tamaño de bloque del sistema de archivos. Esto puede contar si rsync algunos archivos de una máquina Linux a un nas y desea comparar el directorio sincronizado por su cuenta. Puede obtener diferentes resultados con du debido a los diferentes tamaños de bloques ....

Jimmy Koerting
fuente
0

También es posible que desee revisar xdiskusage . Le dará la misma información, pero se muestra gráficamente, y permite profundizar (muy útil). Hay otras utilidades similares para KDE e incluso Windows.

sleske
fuente
0

Usted podría usar ls en conjunto con awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

La salida de ls se canaliza a awk. awk comienza a procesar los datos. El delimitador estándar es el espacio. La variable de suma tot se inicializa a cero; la siguiente declaración se ejecuta para cada fila / línea producida por ls. Simplemente incrementa tot con el tamaño. $5 representa la quinta columna (producida por ls ). Al final dividimos por (1024 * 1024) para sumar en megabytes.

Si desea convertir esto en un script o función (.bashrc), también puede usarlo para obtener el tamaño de ciertos subconjuntos de directorios, de acuerdo con los tipos de archivo.

Si quieres información de todo el sistema, kdirstat puede ser útil!

J.M. Stoorvogel
fuente
Estoy de acuerdo en que se puede expandir este ejemplo y hacer trucos como obtener el tamaño de "ciertos subconjuntos de directorios, según los tipos de archivo", etc. Puede parecer un buen punto de partida. Sin embargo, esta solución es defectuosa desde el principio. A todos los usuarios que deseen utilizar este método les recomiendo que lean las respuestas y los comentarios para esta pregunta así como el artículo vinculado allí . No digo que no puedas hacerlo en absoluto. Conozca las limitaciones, eso es todo.
Kamil Maciorowski