Skip to content

Instantly share code, notes, and snippets.

@omargtdev
Last active April 27, 2022 01:47
Show Gist options
  • Save omargtdev/5e0767087ed752ef3683b78d8332d892 to your computer and use it in GitHub Desktop.
Save omargtdev/5e0767087ed752ef3683b78d8332d892 to your computer and use it in GitHub Desktop.
Explicacion acerca del tamaño de los archivos en Linux

Tamaño de objetos (archivos y directorios) en Linux

Los archivos y directorios que tenemos en nuestro sistema pesan y representan algo en el espacio de nuestro disco, ya sea bytes, kb, mg, gb, etc.

Ver el tamaño de los archivos

Tenemos varios comandos, pero lo mas fundamentales y usados que viene por defecto en nuestra shell son ls y du. Estos comandos sirven para mostrar el tamaño de nuestros archivos. Pongamos un ejemplo con un directorio. En este caso usaremos el directorio "example" para el ejemplo.

omargtdev@PC:~/example$ ls -lh
total 24K
-rw-r--r-- 1 omargtdev omargtdev 5.4K Apr 26 12:45 file1
-rw-r--r-- 1 omargtdev omargtdev  770 Apr 26 12:46 file2
drwxr-xr-x 2 omargtdev omargtdev 4.0K Apr 26 12:42 myDirectory1
drwxr-xr-x 2 omargtdev omargtdev 4.0K Apr 26 12:42 myDirectory2
-rwxr--r-- 1 omargtdev omargtdev   90 Apr 26 12:47 script.sh
-rw-r--r-- 1 omargtdev omargtdev    0 Apr 26 12:42 zerofile

Podemos observar que example tiene 4 archivos y 2 directorios. Con ls -lh hacemos que nos muestre con detalle los directorios y que su espacio nos muestre en formato humano (kb, mg, gb) para que sea mas fácil de leer. En este caso vemos que los directorios tienen 4k de espacio, veamos que hay en ellos.

omargtdev@PC:~/example/myDirectory1$ ls -lh
total 0

omargtdev@PC:~/example/myDirectory2$ ls -lh
total 8.0K
-rw-r--r-- 1 omargtdev omargtdev 628 Apr 26 13:02 carta.txt
-rw-r--r-- 1 omargtdev omargtdev 141 Apr 26 13:00 index.js

Pero como es posible que cuando liste los directorios en example me muestre que el espacio de myDirectory2 es de 4k, si ahi me muestra que es de 8k, y es más, los 2 archivos que tengo en myDirectory2 no pesan mas de 1k juntos.

Bloques en el sistema de archivos

Bueno para explicar esto, primero hay que ver como el sistema de archivos, almacena estos archivos en el disco. Normalmente, los archivos que se crean y contengan, almenos 1 byte de tamaño, se les considerará un bloque en el disco (que normalmente son 4k). Lo podemos ver si ejecutamos estos comandos.

Por ejemplo, sudo tune2fs -l <disk_path>, en este caso disk_path será /dev/sda, nos mostrará un monton de información de nuestro sistema de archivos, en este caso normalmente ext4 en linux, y en la parte de block size podemos encontrar la cantidad de bytes que se le otorga a los bloques de los archivos.

First block:              0
Block size:               4096
Fragment size:            4096

Tambien el comando sudo blockdev --getbsz /dev/sda que nos mostrara la cantidad de bytes de un bloque en el sistema de archivos. (4096 bytes)

Es por eso que cuando creamos un archivo vacio, este no tomará ningun espacio en disco, pero si existirá en los meta-datos (incluyendo el nombre del archivo) de la carpeta que lo contenga, que tiene que ver mucho con los 4k que presenta siempre las carpetas. Pero bueno regresando a los archivos, estos tomarán 1 bloque de espacio (4k) cuando almenos tenga 1 byte de tamaño, ahi la razón por la cual el total de ls -lh nos muestra 8k por los 2 archivos.

¿Pero que pasaria si el archivo tiene un tamaño mayor a 4k?

Pues, simplemente tomará el tamaño de 2 bloques. Y volviendo a mencionar, que dependerá del tamaño del archivo, por ejemplo agreguemos más bytes al archivo carta.txt de myDirecory2 En este caso le agregué más texto para aumentar su tamaño. Ahora sería de este el resultado.

omargtdev@PC:~/example/myDirectory2$ ls -lh
total 12K
-rw-r--r-- 1 omargtdev omargtdev 5.6K Apr 26 13:36 carta.txt
-rw-r--r-- 1 omargtdev omargtdev  141 Apr 26 13:00 index.js

Ahora aparecerá 12k como espacio total, ¿por qué?. Pues porque ahora carta.txt tiene el tamaño de 2 bloques (8k) y con index.js sería 12k.

Esos 5.6k y 141 bytes es el tamaño del archivo en si, no el tamaño en disco que se le otorga en bloques (4k)

Tamaño en los directorios

Como vimos antes, los directorios aunque tengan archivos de mas de 5k, estos siempre se mostraran con 4k de espacio, pero no siempre. Los directorios en si son objetos que se le asignan bloques de espacio en el disco, en donde estos guardan informacion de la lista de archivo que los contienen, los metadatos y sus nombres. Es por eso que con ls nos muestra la cantidad de espacio de disco que registra. Por ejemplo, volvamos a listar la carpeta de example

omargtdev@PC:~/example$ ls -lh
total 24K
-rw-r--r-- 1 omargtdev omargtdev 5.4K Apr 26 12:45 file1
-rw-r--r-- 1 omargtdev omargtdev  770 Apr 26 12:46 file2
drwxr-xr-x 2 omargtdev omargtdev 4.0K Apr 26 12:42 myDirectory1
drwxr-xr-x 2 omargtdev omargtdev 4.0K Apr 26 14:48 myDirectory2
-rwxr--r-- 1 omargtdev omargtdev   90 Apr 26 12:47 script.sh
-rw-r--r-- 1 omargtdev omargtdev    0 Apr 26 12:42 zerofile

A pesar que myDirectory2 este vacio, este ocupa un espacio en disco, para guardar la información de archivos (nombres), ya que gradualmente estos, aumentara o no si creamos mas archivos. Para mostrarlo en un ejemplo crearemos una carpeta y le llenaremos de 1000 archivos.

omargtdev@PC:~/example$ mkdir test
omargtdev@PC:~/example$ cd test
omargtdev@PC:~/example/test$ ls -ldh
drwxr-xr-x 2 omargtdev omargtdev 4.0K Apr 26 15:17 .
omargtdev@PC:~/example/test$ for ((i=0; i<1000; i++)); do touch myFile_$i; done 
omargtdev@PC:~/example/test$ ls -ldh
drwxr-xr-x 2 omargtdev omargtdev 36K Apr 26 15:19 .

Con ls -ldh mostramos las carpetas, en este caso solo la misma carpeta test, y mostramos su espacio, que son 4k. Ahora creamos 1000 archivos con ese script de bash, y cuando lo listamos denuevo ahora el tamaño de la carpeta es de 36k. Se creo, o mejor dicho, la carpeta esta tomando 9 bloques (9 * 4k = 36k) para almacenar todos los metadatos y nombres de los archivos que contiene, muy aparte del tamaño de los archivos, ya que ls muestra el tamaño de los objetos (carpetas y archivos) individualmente, y no de forma recursiva a diferencia de du, que lo veremos mas adelante. Pero que pasa si eliminamos los archivos de la carpeta, el espacio de la carpeta deberia reducirse. Veamos

omargtdev@PC:~/example/test$ rm *
omargtdev@PC:~/example/test$ ls -l
total 0
omargtdev@PC:~/example/test$ ls -ldh
drwxr-xr-x 2 omargtdev omargtdev 36K Apr 26 15:35 .

No, el espacio se mantiene igual y no reducirá el espacio usado por el directorio. Para reducirlo, simplemente borrariamos el directorio y lo creariamos denuevo.

Ver el contenido de los directorios recursivamente

Con du -h nos muestra el tamaño del directorio actual, pero a diferencia de ls que nos muestra el tamaño del objeto individualmente (directorio o archivo), nos muestra el tamaño total contando el tamaño de los archivos que pueda tener en el caso de una carpeta o directorio.

omargtdev@PC:~/example$ du -h
40K     ./test
4.0K    ./myDirectory1
20K     ./myDirectory2
84K     .
omargtdev@PC:~/example$ du -h *
8.0K    file1
4.0K    file2
4.0K    myDirectory1
20K     myDirectory2
4.0K    script.sh
40K     test
0       zerofile

Normalmente nos muestra el directorio y los directorios que contiene, si queremos que nos muestre los demas archivos, lo tenemos que especificar ya sea con el nombre o con * si fuera todos. Pero normalmente du nos muestre el espacio de los archivos que esta tomando en disco, es decir, por bloques. Si queremos mostrar el tamaño en si de los archivos le agreriamos el parametro --apparent-size como en el siguiente bloque de codigo.

omargtdev@PC:~/example$ du -h --apparent-size *
5.4K    file1
770     file2
4.0K    myDirectory1
9.7K    myDirectory2
90      script.sh
36K     test
0       zerofile

En el caso de los directorios, como myDirectory1 nos muestra como 4k aunque el directorio este vacio, es porque nos esta mostrando el espacio que esta ocupando en disco, ya todos los directorios ocupan como minimo 1 bloque de espacio en disco, muy aparte de su contenido.

Conclusion

El sistema de archivos administra el tamaño de los objetos (archivos y directorios) en el sistema, administrandolos por bloques, que estos son normalmente de 4096 bytes (4k). Con ls -lh nos muestra el tamaño de los archivos individualmente, es decir si fuera un directorio no muestra el tamaño que contiene el directorio, sino el mismo directorio en si, ya que este presenta informacion acerca de los objetos que este contiene (nombres y meta-datos). En cambio du -h nos muestra el espacio en disco que ocupan los archivos y directorios, con su respectivo tamaño total de contenido en el caso de directorios, si queremos que nos muestre el tamaño total, muy aparte de lo que ocupa en disco, le agregamos el parametro --apparent-size que seria un equivalente al ls -lh solo en el caso de los archivos, ya que los directorios si nos mostrará el total, tanto el tamaño del directorio (como objeto) y su contenido que lleva.

Y en términos mas "simples", ls -lh para archivos y du -h para el contenido total de las carpetas o directorios.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment