`du` показывает ненулевой размер пустого каталога

`du` показывает ненулевой размер пустого каталога

Я знаю, что когда я создаю пустой каталог, он имеет свой собственный размер:

mkdir test && du -h test

дает:

4,0K    test

Но это другой случай. У меня был каталог с 1e6 файлами (74 ГБ) на внешнем HDD (ext4). Я обработал эти файлы, сохранил в другом каталоге и удалил из этого места в параллельном скрипте. Теперь этот каталог должен быть пустым. Так что все в порядке, что

ls -a raw/all

Распечатать

.  ..

Но

du -h raw/all

дает

19M     raw/all

Без него -hу нас ровно 19288B. И это тоже странный результат:

ls -la raw/all

total 19292
drwxr-xr-x 2 daniel daniel 19746816 wrz 18 19:23 .
drwxrwxr-x 4 daniel daniel     4096 wrz 17 13:21 .. 

Что происходит? Есть ли кэш в duкоманде? Или после обработки такого количества файлов остались какие-то остатки после этих файлов? Я удалил filed by unlinkв скрипте perl5.

Обновление - ответы на вопросы из комментариев

ls -aiR raw/all
raw/all:
51647758 .  51647760 ..

lsof +L1 

печатает 44 строки, но ничего не связано с этим каталогом. Но lsofвыдает что-то с числами типа 19746816.

lsof | grep raw
bash      5355                daniel  cwd       DIR               8,17  19746816   51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
lsof      5677                daniel  cwd       DIR               8,17  19746816   51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
grep      5678                daniel  cwd       DIR               8,17  19746816   51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all
lsof      5679                daniel  cwd       DIR               8,17  19746816   51647758 /media/daniel/f2971ccd-4841-4da3-8ce3-d9f2cc03fc27/daniel/pro/scraper/raw/all

Ноутбук перезагрузили. Внешний диск отключили. Но duвсе равно показывает 19M.

решение1

Каталоги в файловых системах ext4 растут, но не уменьшаются. Так что, если в какой-то момент ему пришлось занять 19 МБ для хранения информации о файлах, он сохранит столько места, даже если эти файлы будут удалены. Если вы хотите уменьшить теперь пустой каталог, удалите его и создайте заново:

rmdir foo && mkdir foo

Или, сохраняя разрешения:

mkdir foo2
chown --reference=foo foo2
getfacl foo | setfacl --set-file=- foo2
rmdir foo
mv foo2 foo

Источник:

Связанный контент