Disk-Usage

無論磁碟使用情況如何,獲取目錄的大小(包括其所有內容)

  • September 1, 2019

一般問題

假設兩個具有相同內容的目錄儲存在不同的設備上。有沒有辦法計算目錄的大小並總是得到完全相同的數字?換句話說,是否存在目錄的“實際大小”之類的東西,而不管它儲存在哪裡?

實際例子

我使用rsync -ahP /dir1/ /dir2/. 傳輸完成後沒有錯誤,我使用du -s --apparent-size. 對於某些目錄,我在兩個設備上都得到了完全相同的數字,但不是所有的。

具體問題

是否有可能rsync選擇的選項沒有產生目錄的精確副本?如果是的話,有沒有辦法得到一個精確的副本?

無論儲存設備如何,使用的du命令是否都沒有給出目錄的“實際大小”。如果是,有沒有辦法計算這樣的大小?

請注意du,即使是帶有選項的 GNU--apparent-size也將包括所有類型文件的表觀大小(由 報告lstat()),包括正常文件設備符號連結fifos目錄。像許多其他實現一樣, GNUdu會嘗試多次不計算同一個文件(例如當有多個硬連結指向同一個文件時)。

在這裡,由於您沒有將-H選項傳遞給rsync,因此不會保留硬連結,因此du如果源中有硬連結,排除 的帳戶中的重複項會導致差異。

目錄類型文件的表觀大小確實代表了其數據的實際大小:文件名列表以及在哪裡可以找到它們的資訊,但該列表的格式和大小取決於文件​​系統的類型,它是如何配置,以及如何填充目錄。

對於rsync不傳輸任何數據的設備文件、fifos、套接字,一些系統(如 Linux)總是返回 0 作為表觀大小,一些系統會返回可以從中讀取的數據量(例如對於塊設備文件,它可能是相應儲存的大小)。

因此,在這裡,您可以做的最好的事情可能是計算正常文件和符號連結文件的表觀大小的總和,這些文件是從一個系統到另一個系統一致的文件¹。

你可以用 GNU 做到這一點find

find . -type f,l -printf '%s\n' | awk '{s+=$0}; END{print s}'

如果您在源和目標上發現相同的編號,則表明rsync可能已成功傳輸所有數據(正常文件的內容和符號連結(它們的目標路徑))。它可能無法傳輸所有元數據,例如擴展屬性、ACL(由於您沒有傳遞-Xand-A選項,因此您無論如何都不會保留這兩者)、文件名、空文件……

作為目錄數據量的一致表示(假設沒有編碼問題¹),您可以使用find . | wc -c(所有文件路徑長度的總和 + 1)。

您還可以使用(dry-run) 和(verbose)重新執行相同的rsync命令來檢查是否缺少某些東西,也許添加一個來檢查目標文件而不是源文件。-n``-v``--delete


¹ 嚴格來說,如果對文件名進行了一些轉換,例如在某些情況下對非 ASCII 字元進行字元編碼轉換,特別是在涉及非 Unix 或 macOS 文件系統的情況下,符號連結的大小可能會有所不同

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