Questo è un piccolo post divertente, completamente inutile e poco pratico, sui directory nei sistemi *nix. È venerdì, dopo tutto.
Durante i colloqui di lavoro, spesso compaiono domande noiose sugli inode e sul fatto che tutto sia un file, a cui pochi sanno rispondere in modo sensato. Ma se si scava un po' più a fondo, si possono scoprire cose curiose.
Per comprendere il post, ecco alcuni punti chiave:
- tutto è un file. una directory è anch'essa un file.
- in un inode sono memorizzati i metadati di un file, ma il nome del file non è memorizzato lì.
- il nome del file è memorizzato nei dati della directory.
- la dimensione della directory, quella che viene mostrata con il comando ls e che per default è di 4KB, dipende dal numero di file nella directory e dalla lunghezza dei loro nomi.
- è ovvio che più file ci sono, maggiore sarà la dimensione della directory.
E ora la parte interessante: creiamo una directory con un milione di file, controlliamo la dimensione della directory e poi cancelliamo tutti i file e osserviamo la dimensione della directory.
$ mkdir niceDir && cd niceDir
# a seconda della velocità del supporto, il comando seguente potrebbe richiedere 2-10 minuti
$ 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 Aug 2 13:37 .
$ find . -type f -delete
$ ls -l
total 0
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M Aug 2 13:37 .Come si può notare, la dimensione della directory non è cambiata, anche se sembrerebbe 🙂
Riparare la dimensione della directory (senza eliminare) è possibile solo con fsck (e l'opzione -D) in uno stato smontato.
E quando ho iniziato a cercare il perché, mi sono accorto che 10 anni fa questo comportamento era già in lkml. E secondo gli sviluppatori, la correzione semplicemente non vale lo sforzo coinvolto.
Fonte: habr.com
