¿Cómo obtener el tamaño físico de un archivo en Linux?

12

Puedo usar ls -lpara obtener el tamaño lógico de un archivo, pero ¿hay alguna manera de obtener el tamaño físico de un archivo?

usuario285003
fuente
Por favor, defina qué quiere decir con tamaño "físico".
Jörg W Mittag

Respuestas:

28

ls -lle dará el tamaño aparente del archivo, que es la cantidad de bytes que leería un programa si leyera el archivo de principio a fin. dule daría el tamaño del archivo "en el disco".

Por defecto, dule da el tamaño del archivo en número de bloques de disco, pero puede usarlo -hpara obtener una unidad legible por humanos. Consulte también el manual de dusu sistema.

Tenga en cuenta que con GNU coreutil's du(que es probablemente lo que tiene en Linux), -bobtener bytes implica la --apparent-sizeopción. Esto no es lo que desea usar para obtener el número de bytes realmente utilizados en el disco. En su lugar, use --block-size=1o -B 1.

Con GNU ls, también puede hacerlo ls -s --block-size=1en el archivo. Esto le dará el mismo número que du -B 1para el archivo.


Ejemplo:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Esto significa que este es un archivo de 512 MB que ocupa aproximadamente 24 KB en el disco. Es un archivo disperso (en su mayoría ceros que no se escriben realmente en el disco pero se representan como "agujeros" lógicos en el archivo). Los archivos dispersos son comunes cuando se trabaja con archivos grandes preasignados, por ejemplo, imágenes de disco para máquinas virtuales o archivos de intercambio, etc. Crear un archivo disperso es rápido, mientras que llenarlo con ceros es lento (e innecesario).

Consulte también el manual de fallocatesu sistema Linux.

Kusalananda
fuente
en cuyo caso esta diferencia es importante? ¿Puedes dar un ejemplo práctico? gracias de antemano.
D'Arcy Nader
1
@ D'ArcyNader Ver respuesta actualizada.
Kusalananda
Corríjame si malinterpreto algo, pero parece que la primera oración es al revés: stackoverflow.com/a/31437673/3701431 du mostraría cuántos datos se pueden leer realmente, mientras lsmuestra hasta qué punto se asignan los sectores del disco.
Sergiy Kolodyazhnyy
2
@SergiyKolodyazhnyy (perdón por responder tarde) No, dumuestra la cantidad de disco realmente en uso por el archivo, mientras que el tamaño aparente (tamaño lógico) que se muestra lses cuántos bytes podría leer un programa. Si el archivo es escaso, algunos de los bytes leídos serían ceros, pero aún se entregarían al programa que los leyó (simplemente no desde el disco).
Kusalananda
Esta fue una muy buena respuesta.
Lizardx
3

Obtengo el tamaño del archivo en bytes como este:

actualsize=$(du -b "${file}" | cut -f 1)
woohoo
fuente