Este es un pequeño post curioso, completamente innecesario en la práctica, pero divertido, sobre directorios en sistemas *nix. Es viernes, después de todo.
A menudo surgen preguntas aburridas sobre inodos en las entrevistas, sobre todo-es-un-archivo, a las que pocos pueden responder de manera coherente. Pero si indagas un poco más, puedes encontrar cosas interesantes.
Para entender el post, un par de puntos clave:
- todo es un archivo. un directorio también es un archivo.
- en el inodo se almacenan los metadatos del archivo, pero el nombre del archivo no se almacena allí.
- el nombre del archivo se almacena en los datos del directorio.
- el tamaño del directorio, que se muestra en ls y que por defecto es de 4KB, depende de la cantidad de archivos en el directorio y de la longitud de sus nombres.
- obviamente, cuanto más archivos haya, mayor será el tamaño del directorio.
Y ahora algo interesante: creamos un directorio con un millón de archivos, comprobamos el tamaño del directorio y luego borramos todos los archivos y observamos el tamaño del directorio.
$ mkdir niceDir && cd niceDir
# dependiendo de la velocidad del soporte, el siguiente comando puede tardar entre 2 y 10 minutos.
$ for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i ; done
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M 2 de Ago 13:37 .
$ find . -type f -delete
$ ls -l
total 0
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M 2 de Ago 13:37 .Como puedes notar, el tamaño del directorio no cambió, aunque parecería que sí 🙂.
Reparar el tamaño del directorio (sin eliminar) solo se puede hacer con fsck (y la opción -D) en estado desmontado.
Y cuando fui a investigar por qué era así, descubrí que hace 10 años ya había un comportamiento similar en lkml. Y según los desarrolladores, la corrección simplemente no merece el esfuerzo adicional.
Fuente: habr.com
