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.
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.
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.
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)
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.
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.
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.