Размер директорий не стоит наших усилий
Это совершенно бесполезный, ненужный в практическом применении, но забавный небольшой пост про директории в *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. И по мнению разработчиков исправление просто не стоит вложенных усилий.