`du` 显示空目录的大小非零

`du` 显示空目录的大小非零

我知道,当我创建空目录时它有自己的大小:

mkdir test && du -h test

给出:

4,0K    test

但这种情况是另一种情况。我在外部硬盘 (ext4) 上有一个包含 1e6 个文件 (74 GB) 的目录。我处理了这些文件,保存在其他目录中,并在并行脚本中从此位置删除。现在这个目录应该是空的。所以没问题

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?或者处理了这么多文件之后,这些文件后面还有剩余的吗?我删除了unlinkperl5 脚本中的文件。

更新-评论中问题的答案

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 文件系统中的目录会增长,但不会缩小。因此,如果某个时候它必须占用 19M 来存储其中文件的详细信息,即使这些文件被删除,它也会保留那么多空间。如果您想缩小现在为空的目录,请删除并重新创建它:

rmdir foo && mkdir foo

或者,保留权限:

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

来源:

相关内容