“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

相關內容