Linux / Comando / du: medir el espacio de archivos y directorios

du es un comando que muestra el espacio utilizado por archivos y directorios en el sistema de archivos. Para comprobar el tamaño de los elementos secundarios del directorio actual en unidades legibles para humanos, use du -h --max-depth=1 ., y para ver solo el total, use du -sh ..

du -h --max-depth=1 .
du -sh .

El valor predeterminado de du se basa en los bloques realmente asignados por el sistema de archivos, no en el tamaño aparente del contenido del archivo. En archivos dispersos, sistemas de archivos con compresión, enlaces duros y entornos Copy-on-Write, puede diferir de las cifras obtenidas con otras herramientas.

¿Qué calcula el comando du?

du es la abreviatura de disk usage, recorre árboles de archivos y directorios sumando el uso de disco. Afecta no solo el contenido de los archivos, sino también la forma en que el sistema de archivos asigna bloques, por lo que no siempre coincide con el tamaño de archivos que muestra ls -l.

Se pueden encontrar opciones y limitaciones de cálculo en la documentación oficial de du de GNU Coreutils.

Comando básico más utilizado

Comprobar el tamaño total del directorio actual

du -sh .

-s muestra solo el total, -h lo muestra en unidades fáciles de leer como KiB, MiB, GiB. Los archivos ocultos y los directorios ocultos también se incluyen en el total del directorio actual.

Comprobar el tamaño de cada elemento debajo

du -h --max-depth=1 .

--max-depth=1 muestra los totales hasta un nivel por debajo del punto de inicio. Limita la profundidad de la salida, pero sigue recorriendo los subdirectorios para calcular los totales. En GNU du también se puede escribir -d 1; compruebe la compatibilidad en otras implementaciones.

Ordenar para encontrar grandes elementos

du -h --max-depth=1 /var | sort -h

sort -h se ordena considerando unidades fáciles de leer. Para mostrar los elementos más grandes arriba, se utiliza sort -hr.

du -h --max-depth=1 /var | sort -hr

En los directorios sin permisos, se pueden producir errores y el total puede ser incompleto. Ejecute con los permisos apropiados solo en el rango necesario y no interprete simplemente los errores ocultos como valores completos.

Resumen de opciones principales

Opciones Función Ejemplo de uso
-h Mostrar en unidades fáciles de leer du -h /var/log
-s Mostrar solo la suma de cada argumento du -sh /var/log
-a Mostrar no solo directorios sino también archivos du -ah ./data
-c Agregar el total al final du -ch file1 file2
-d N Especificar la profundidad máxima del directorio a mostrar du -h -d 2 .
-x No pasar a otros sistemas de archivos du -xhd1 /
--exclude Excluir rutas que coincidan con el patrón du -sh --exclude='*.log' .
--apparent-size Mostrar el tamaño aparente en lugar de los bloques asignados du -sh --apparent-size file

Buscar archivos y directorios en detalle

Mostrar incluso todos los archivos

du -ah ./data | sort -hr | head -n 20

Los ejemplos de ./data requieren un directorio existente con archivos propios. Para la comparación posterior, elija un archivo de prueba llamado sample.img. Cree también du-exclude.txt, con un patrón por línea, antes de usar --exclude-from. Los ejemplos son independientes. En árboles grandes, recorrer y ordenar todas las rutas puede consumir mucha entrada/salida de disco y memoria.

Mostrar solo elementos de un tamaño mínimo

du -h --threshold=1G ./data

En GNU du, --threshold=1G muestra entradas con un uso mayor o igual a 1 GiB. Con un directorio como argumento y sin -a, muestra totales de directorios, no cada archivo. El filtro reduce la salida, pero no evita recorrer el árbol para calcular los tamaños. Compruebe du --help si utiliza otra implementación.

Excluir archivos o directorios específicos

du -sh --exclude='*.log' --exclude='cache' .

Es recomendable poner las expresiones de patrón de --exclude entre comillas simples para que el shell no las expanda primero. Si hay muchas reglas de exclusión, puede crear un archivo con una regla por línea y usar --exclude-from.

du -sh --exclude-from=du-exclude.txt .

Diferencia entre el uso real y el tamaño aparente

Uso básico del disco

El du básico suma los bloques que el sistema de archivos ha asignado a los archivos. Incluso los archivos muy pequeños pueden usar espacio equivalente al tamaño mínimo de bloque, y los metadatos del archivo o la estructura interna del sistema de archivos pueden no reflejarse completamente en el resultado.

Tamaño aparente

El --apparent-size muestra un valor cercano a la longitud lógica del contenido del archivo en archivos normales.

du -h sample.img
du -h --apparent-size sample.img

Los archivos dispersos pueden tener un tamaño lógico muy grande pero usar casi ningún bloque real. Por el contrario, en entornos con compresión del sistema de archivos, deduplicación, instantáneas o bloques compartidos Copy-on-Write, incluso el du básico puede diferir de la cantidad real consumida en el dispositivo físico.

Enlace duro

Si varios caminos apuntan al mismo inodo (la estructura que identifica y describe un archivo) mediante enlaces duros, GNU du contará el espacio del mismo archivo solo una vez por defecto. La atribución del uso a un camino puede variar según el orden en que se pasen los argumentos. Usar la opción para calcular cada enlace por separado puede hacer que el total sea mayor que los bloques únicos reales.

Limitar a los límites del sistema de archivos

Excluir sistemas de archivos diferentes

Al examinar el sistema de archivos raíz, usar -x o --one-file-system no profundiza en otros sistemas de archivos.

du -xhd1 /

La opción -x evita descender a sistemas de archivos diferentes. No excluye necesariamente todos los puntos de montaje: un montaje de enlace del mismo sistema de archivos puede seguir incluido. Compruebe qué volúmenes necesita medir antes de interpretar el total.

Procesamiento de enlaces simbólicos

du, de manera predeterminada, no sigue los objetivos a los que apuntan los argumentos de línea de comandos o los enlaces simbólicos dentro de los directorios. La opción de seguir los enlaces puede recorrer en gran cantidad otros directorios o sistemas de archivos, así que úsela después de verificar la estructura objetivo.

Razón por la cual los resultados de du y df son diferentes

El objetivo del cálculo es diferente

du suma los archivos del árbol de directorios accesible, pero df informa el uso de bloques de todo el sistema de archivos. Las diferencias pueden deberse a metadatos del sistema de archivos, bloques reservados, instantáneas, rutas no accesibles por permisos, entre otros.

Archivo abierto pero eliminado

Si solo se elimina la ruta mientras un proceso mantiene el archivo abierto, du no puede encontrar ese archivo, pero el bloque no se libera hasta que el proceso cierre el archivo, por lo que en df sigue apareciendo como en uso. Puede verificar archivos abiertos eliminados de la siguiente manera.

lsof +L1

Si lsof no está instalado, instale el paquete correspondiente a su distribución; algunos procesos solo serán visibles con permisos suficientes. No fuerce el cierre del proceso: revise el procedimiento de reinicio del servicio o reapertura de registros. Manipular su descriptor de archivo puede provocar pérdida de datos o fallos del servicio.

Método seguro y preciso de uso

  • Primero, verifique el sistema de archivos lleno con df -h y luego ejecute du dentro de ese punto de montaje.
  • Cuando se investigue desde root, decida si debe excluir otros sistemas de archivos con -x.
  • En directorios grandes, limite la salida por profundidad y realice la investigación por etapas durante horas de baja carga laboral.
  • Si hay errores de permisos, registre que los resultados son incompletos y use solo los permisos mínimos necesarios.
  • Antes de eliminar un archivo, compruebe el proceso propietario, la copia de seguridad, la política de almacenamiento y si es posible recuperar el archivo.
  • Como los nombres de archivo pueden incluir caracteres especiales como saltos de línea, en la automatización considere una combinación de herramientas que admitan la opción de separación NUL.

Preguntas frecuentes

¿Se incluyen los archivos ocultos en el resultado de du?

Si se especifica el propio directorio como du -sh ., los archivos ocultos se incluyen en el total. Sin embargo, * de la shell no coincide con los elementos ocultos de forma predeterminada, por lo que pueden faltar en el resultado de du -sh *.

¿Cómo se puede encontrar rápidamente solo el directorio más grande?

Revise por niveles con du -h --max-depth=1 DESTINO | sort -hr, sustituyendo DESTINO por el directorio que necesita examinar. Así reduce la salida y el trabajo de ordenación respecto a listar cada archivo; du sigue recorriendo los subdirectorios para sumar sus tamaños.

¿Por qué los tamaños de du -sh y ls -lh son diferentes?

ls -lh muestra principalmente la longitud lógica de los archivos, mientras que la salida predeterminada de du muestra los bloques del sistema de archivos asignados. Pueden existir diferencias debido a archivos dispersos, archivos pequeños y el tamaño de los bloques.

¿Se puede ocultar el error de Permiso denegado?

Se puede hacer que la pantalla sea más clara, pero también desaparece el hecho de que los resultados son incompletos. En la investigación de capacidad, es más seguro primero verificar la ruta donde ocurrió el error y revisar la razón y el alcance de los permisos necesarios.