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

Це абсолютно марний, непотрібний у практичному застосуванні, але кумедний невеликий пост для директорії в *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

Додати коментар або відгук