Files
ls -lh 和 du -h 在使用 truncate 時給出不同的文件大小
我正在嘗試找到一種在使用日誌文件時減小日誌文件大小的方法。
所以對於一個文件,我嘗試了這個:
$ yes > yeslog
所以數據被
yeslog
連續寫入。在我用
ls -alh yeslog
and檢查尺寸之後du -h yeslog
,它們報告的尺寸相同。然後我做
truncate -s 0K yeslog
,然後我再次用ls
和檢查尺寸du
。但是現在,du
顯示的尺寸縮小了,而ls
顯示的尺寸與以前相同。為什麼會發生這種情況,並且 truncate 真的在發揮作用嗎?
這是linux 如何管理文件偏移量的變體。兩者都是正確的
ls
,du
它們測量的是不同的東西。當您執行時
truncate
,它會將文件減少到 0 字節。然而yes
立即再次寫入它,在它之前寫入的偏移量之後;所有失去的數據都被零替換,完全失去的塊被稀疏替換。結果,文件的表觀大小不斷增加,但每次執行時它在磁碟上消耗的實際磁碟空間又回到 0truncate
,並且在寫入文件時它再次增加yes
,但不計算稀疏塊。
ls
預設情況下顯示文件的表觀大小,而du
顯示消耗的磁碟空間,因此ls
將顯示比du
第一個truncate
失去整個塊的值更大的值。您可以使用標誌ls
顯示分配的大小。-s
如果您要求外殼程序附加到
yeslog
(yes >> yeslog
),則文件將打開O_APPEND
並yes
在文件被截斷後從文件開頭寫入,而不是繼續以與以前相同的偏移量寫入。