Това е напълно безполезен, ненужен в практическото приложение, но забавен малък пост за директориите в *nix системи. Все пак е петък.
На интервюта често се задават скучни въпроси за айнодите, всичко-е-файлове, на които малко хора могат да отговорят адекватно. Но ако копаем малко по-дълбоко, можем да намерим интересни неща.
За да разберем поста, ето няколко основни момента:
- всичко е файл. директорията също е файл
- в айнода се съхраняват мета-данни на файла, но името на файла не се съхранява там
- името на файла се съхранява в данните на директорията
- размерът на директорията, същият, който се показва в ls и по подразбиране 4Кб, зависи от броя на файловете в директорията и дължината на имената им
- очевидно е, че колкото повече файлове, толкова по-голям е размерът на директорията
А сега интересното: създаваме директория с милион файлове, проверяваме размера на директорията, а след това изтриваме всичките файлове и поглеждаме размера на директорията.
$ mkdir niceDir && cd niceDir
# в зависимост от скоростта на носителя, следващата команда може да отнеме 2-10 минути
$ 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 .Както може да се заб注意, размерът на директорията не се е променил, въпреки че би трябвало 🙂
Размерът на директорията (без изтриване) може да бъде поправен само с fsck (и опцията -D) в демонтирано състояние.
А когато започнах да търся защо е така, открих, че 10 години по-рано такова поведение вече е в lkml. И по мнението на разработчиците, поправката просто не си струва вложените усилия.
Източник: habr.com
