“du”如何计算已使用的块数

“du”如何计算已使用的块数

我很想了解如何du计算文件中使用的块。

设想

dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s

ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big

du -h big
0       big

我一直认为它会给我不同的答案ls,这很好,因为他们测量的是不同的东西。

现在我有一个基于云的文件系统,我不仅要为存储付费,而且每次下载数据时也要付费,因此我需要最大限度地减少一般内务活动访问的数据量,例如“这棵树使用了多少磁盘空间? ”

我不知道库/系统调用可以告诉我已使用的块的数量,尽管很可能有一个。我不相信du它会读取它正在考虑的每个文件,因为这无法区分充满零的文件和真正稀疏的文件。

那么,如何du计算已使用的块数呢?

答案1

du用途stat(2)查找文件使用的块数。如果运行,stat big您应该会看到块的数量与 给出的数量匹配du

您可以使用该选项强制du计算字节数;-b那么它的输出与ls's 匹配。

在这两种情况下它都使用stat(2)(或者更确切地说,fstatat(2)至少在我拥有的版本中):

$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big

处理上的区别是可见于du.c

相关内容