¿Cuál es la diferencia entre du -h y ls -lh?

31

Me está costando comprender cuál es la forma correcta de leer el tamaño de los archivos, ya que cada comando le ofrece resultados variables. También encontré una publicación en http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html que establece lo siguiente;

du le da el tamaño del archivo, ya que reside en el sistema de archivos. (IE siempre le dará un resultado que es divisible por 1024).

Le dará el tamaño real del archivo.

Lo que está viendo es la diferencia entre el tamaño real del archivo y la cantidad de espacio en disco que ocupa. (también llamado eficiencia del sistema de archivos).

¿Cuál es la diferencia entre ya que reside en el sistema de archivos y el tamaño real del archivo?

CacahuetesMonkey
fuente

Respuestas:

48

Esto se llama espacio flojo :

Cada capa de abstracción sobre bits y bytes individuales genera espacio perdido cuando un archivo de datos es más pequeño que la unidad de datos más pequeña que el sistema de archivos es capaz de rastrear. Este espacio desperdiciado dentro de un sector, clúster o bloque se conoce comúnmente como espacio flojo, y normalmente no se puede usar para el almacenamiento de datos adicionales. Para sectores individuales de 256 bytes, el espacio máximo desperdiciado es de 255 bytes. Para clústeres de 64 kilobytes, el espacio máximo desperdiciado es de 65.535 bytes.

Entonces, si su sistema de archivos asigna espacio en unidades de 64 KB y almacena un archivo de 3 KB, entonces:

  • El tamaño real del archivo es de 3 KB.
  • el tamaño residente del archivo es de 64 KB, ya que los 61 KB restantes en esa unidad no se pueden asignar a otro archivo y, por lo tanto, se pierden.

Nota : Algunos sistemas de archivos admiten la subasignación de bloques , lo que ayuda a mitigar este problema mediante la asignación de múltiples archivos pequeños (o los extremos finales de archivos grandes) en el mismo bloque.

Manitas5
fuente
1
Esa es una maldita buena explicación.
SpacemanSpiff
1
@ Handyman5 - Gracias Handyman5. Entonces, cuando miro el tamaño de un archivo o carpeta con ls, ¿devuelve el tamaño real mientras du devuelve el tamaño residente? ¿Es eso correcto? Entonces, al mirar el tamaño del archivo, ¿cuál es el más preciso, es decir, el tamaño de residente o el tamaño del archivo o es una pregunta arbitraria?
PeanutsMonkey
8
@PeanutsMonkey, la precisión está en el ojo del espectador. ;-) Básicamente, si le preocupa cuánto espacio ocuparía el archivo en otro lugar (como copiar a través de la red, agregar a un archivo zip, hacer una copia de seguridad en una unidad externa, etc.), entonces el tamaño real es lo que te importa. Si le preocupa la cantidad de espacio que queda en la unidad donde vive el archivo ahora, entonces le importa el tamaño del residente. Como le duestá mostrando el sabio disk u, está mirando el espacio ocupado en la unidad actual y, por lo tanto, le muestra el tamaño del residente.
Handyman5
1
@ Handyman5: es casi un año después de la publicación, pero tengo curiosidad por cómo la respuesta anterior difiere cuando se usa df -h.
PeanutsMonkey
1
dfinforma el número de bloques restantes * el tamaño de bloque del sistema de archivos. En este caso, sería más parecido du, ya que incluso los bloques parcialmente utilizados se consideran completamente asignados. dfBásicamente traduce statvfs , por lo que puede mirar esa llamada al sistema para tener una mejor idea de lo que está sucediendo.
Handyman5
19

Hay otra opción aquí, que no se ha cubierto: archivos dispersos . En este caso, dumostrará un tamaño más pequeño que un simple ls -l, porque lsinforma que el "tamaño" del archivo es el tamaño aparente (el número de bytes que puede leer, si desea un montón de ceros), mientras duque continúe usando el número real de bloques de disco en uso.

Truco divertido: crea una gran cantidad de archivos dispersos grandes, luego impresiona a tus amigos con la cantidad de espacio en disco que tienes ("mira, ¡estoy almacenando once mil millones de archivos de 1 TB en mi disco duro!"). OK, tal vez no sea tan divertido entonces.

womble
fuente
6

Los sistemas de archivos están formados por bloques. Los archivos no tienen que encajar perfectamente en bloques. Si un archivo tuviera 1024 bytes, su tamaño en ls y du sería 1024. Si el tamaño del archivo fuera 1025, el tamaño sería 1025 en ls y 2048 en du.

Tenga en cuenta que el ejemplo anterior supone un tamaño de bloque de 1024. Los tamaños de bloque más grandes son la norma en estos días e, g,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred
Iain
fuente
0

Todavía hay una razón más por la que pueden ser diferentes. du -h sabe cuándo ve el mismo archivo con otro nombre (enlaces duros, en lugar de enlaces simbólicos) e informará a cada archivo del tamaño que tiene, pero solo agregará el tamaño una vez al directorio principal común.

Clifford Heath
fuente