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