Размер директорий не стоит наших усилий

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

© Habrahabr.ru