Files

ls -lh 和 du -h 在使用 truncate 時給出不同的文件大小

  • November 13, 2020

我正在嘗試找到一種在使用日誌文件時減小日誌文件大小的方法。

所以對於一個文件,我嘗試了這個:

$ yes > yeslog

所以數據被yeslog連續寫入。

在我用ls -alh yeslogand檢查尺寸之後du -h yeslog,它們報告的尺寸相同。

然後我做truncate -s 0K yeslog,然後我再次用ls和檢查尺寸du。但是現在,du顯示的尺寸縮小了,而ls顯示的尺寸與以前相同。

為什麼會發生這種情況,並且 truncate 真的在發揮作用嗎?

這是linux 如何管理文件偏移量的變體。兩者都是正確的lsdu它們測量的是不同的東西。

當您執行時truncate,它會將文件減少到 0 字節。然而yes立即再次寫入它,在它之前寫入的偏移量之後;所有失去的數據都被零替換,完全失去的塊被稀疏替換。結果,文件的表觀大小不斷增加,但每次執行時它在磁碟上消耗的實際磁碟空間又回到 0 truncate,並且在寫入文件時它再次增加yes,但不計算稀疏塊。

ls預設情況下顯示文件的表觀大小,而du顯示消耗的磁碟空間,因此ls將顯示比du第一個truncate失去整個塊的值更大的值。您可以使用標誌ls顯示分配的大小。-s

如果您要求外殼程序附加yeslog( yes >> yeslog),則文件將打開O_APPENDyes在文件被截斷後從文件開頭寫入,而不是繼續以與以前相同的偏移量寫入。

引用自:https://unix.stackexchange.com/questions/619419