Disk-Usage

文件夾對磁碟使用的獨特貢獻

  • November 18, 2018

我有一個包含每日快照文件夾的備份。為了節省空間,不同快照中的相同文件通過硬連結(由 rsync 生成)進行重複數據刪除。

當我的空間不足時,一種選擇是刪除較舊的快照。但是由於硬連結,很難弄清楚刪除給定快照會獲得多少空間。

我能想到的一個選擇是du -s首先在所有快照文件夾上使用,然後在除我可能刪除的文件夾之外的所有文件夾上使用,差異會給我預期的獲得空間。但是,這非常麻煩,並且在我試圖找到合適的快照進行刪除時必須重複。

有沒有更簡單的方法?


在嘗試並思考了Stéphane Chazelasderobert的答案後,我意識到我的問題不夠精確。這是一個更精確的嘗試:

我有一組目錄(“快照”),其中包含與另一個快照中的文件部分儲存相同(硬連結)的文件。我正在尋找一種解決方案,它為我提供快照列表以及其中的文件佔用的每個已用磁碟儲存量,但沒有另一個快照中的文件也使用的儲存空間。我想考慮到每個快照中都有硬連結的可能性。

這個想法是我可以查看該列表來決定當我用完空間時應該刪除哪些快照,這是在刪除獲得的儲存空間和快照的價值(例如基於年齡)之間進行權衡。

您可以使用 GNU 手動完成find

find snapshot-dir -type d -printf '1 %b\n' -o -printf '%n %b %i\n' |
  awk '$1 == 1 || ++c[$3] == $1 {t+=$2;delete c[$3]}
  END{print t*512}'

這會計算在快照目錄中找到的所有連結都已找到後連結計數將降至 0 的文件的磁碟使用情況。

find印刷:

  • 1 <disk-usage>對於目錄
  • <link-count> <disk-usage> <inode-number>對於其他類型的文件。

我們假設目錄的連結計數始終為 1,因為實際上它不是,這是因為..條目,並且find沒有列出這些條目,並且目錄通常沒有其他硬連結。

從該輸出中,awk計算連結計數為 1 的條目的磁碟使用情況以及它已經看到<link-count>時間的 inode(即所有硬連結都在目前目錄中的那些,就像那些有連結的那些) -一旦目錄樹被刪除,計數為 1 的空間將被回收)。

您還可以使用find snapshot-dir1 snapshot-dir2來找出如果兩個目錄都被刪除,將回收多少磁碟空間(如果在兩個目錄中都找到文件並且僅在那些快照)。

如果您想了解每次刪除快照目錄後將節省多少空間(以累積方式),您可以執行以下操作:

find snapshot-dir* \( -path '*/*' -o -printf "%p:\n" \) \
 -type d -printf '1 %b\n' -o -printf '%n %b %i\n' |
  awk '/:$/ {if (NR>1) print t*512; printf "%s ", $0; next}
       $1 == 1 || ++c[$3] == $1 {t+=$2;delete c[$3]}
       END{print t*512}'

它按詞彙順序處理快照列表。如果您以不同的順序處理它,那可能會給您不同的數字,除了最後一個(當所有快照都被刪除時)。

請參閱numfmt使數字更具可讀性。

假設所有文件都在同一個文件系統上。如果沒有,您可以替換%i%D:%i(如果它們不都在同一個文件系統上,這意味著您將在那裡有一個安裝點,無論如何您都無法刪除)。

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