![`du` 显示空目录的大小非零](https://linux22.com/image/1203220/%60du%60%20%E6%98%BE%E7%A4%BA%E7%A9%BA%E7%9B%AE%E5%BD%95%E7%9A%84%E5%A4%A7%E5%B0%8F%E9%9D%9E%E9%9B%B6.png)
我知道,当我创建空目录时它有自己的大小:
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
?或者处理了这么多文件之后,这些文件后面还有剩余的吗?我删除了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 文件系统中的目录会增长,但不会缩小。因此,如果某个时候它必须占用 19M 来存储其中文件的详细信息,即使这些文件被删除,它也会保留那么多空间。如果您想缩小现在为空的目录,请删除并重新创建它:
rmdir foo && mkdir foo
或者,保留权限:
mkdir foo2
chown --reference=foo foo2
getfacl foo | setfacl --set-file=- foo2
rmdir foo
mv foo2 foo
来源: