Dette er et helt unyttigt, praktisk uanvendeligt, men sjovt lille indlæg om kataloger i *nix-systemer. Det er trods alt fredag.
Til jobsamtaler dukker der ofte kedelige spørgsmål op om inode'er, alt-er-filer, som de færreste kan svare fornuftigt på. Men hvis man graver lidt dybere, kan man finde interessante ting.
For at forstå indlægget, nogle punkter:
- alt er en fil. En katalog er også en fil.
- inode'en gemmer metadata for filen, men filnavnet gemmes der ikke.
- filnavnet gemmes i katalogdataene.
- størrelsen på kataloget, den størrelse der vises i ls og som som standard er 4Kb, afhænger af antallet af filer i kataloget og længden af deres navne.
- det er åbenlyst, at jo flere filer, desto større bliver kataloget.
Og nu det interessante: opretter en katalog med en million filer, tjekker størrelsen på kataloget, og så sletter vi alle filer og ser på størrelsen af kataloget.
$ mkdir niceDir && cd niceDir
# afhængigt af hastigheden på lagermediet, kan den følgende kommando tage 2-10 minutter
$ 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 .Som man kan se, er størrelsen på kataloget ikke ændret, selvom det ville synes 🙂.
For at reparere størrelsen af kataloget (uden at slette) kan man kun gøre det med fsck (og -D optionen) i ikke-monteret tilstand.
Da jeg begyndte at lede efter, hvorfor det var sådan, viste det sig, at dette adfærd allerede for 10 år siden i lkml. Og ifølge udviklerne er det simpelthen ikke værd at investere kræfter i at rette op på det.
Kilde: habr.com
