我很想了解如何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
。