題 為什麼同步的兩個目錄層次結構具有不同的大小?


我正在使用rsync來同步兩個文件夾

rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/

它說一切都很好,但目的地報告:

$ du -s path/media/
18335196    site_media/media/

和來源報導:

$ du -s path/media/
18473500        site_media/media/

當我深入研究這個問題時,所有文件大小都相同,但目錄大小不同。為什麼?兩者都是VM運行ubuntu,源是11.04,目標是12.04 LTS

我理解為什麼他們沒有加起來相同的數字,我想了解的是為什麼文件夾報告不同的大小。


7
2018-06-27 23:43


起源




答案:


由於它是運行不同主要版本的Ubuntu的兩個不同的虛擬機,我懷疑文件系統的塊大小是罪魁禍首。 du 報告使用了多少磁盤,而不是文件大小的總和。一個微妙但重要的區別。

如果您的文件大小為1個字節,則塊大小為1KB du 將報告使用的1KB。如果塊大小為4KB,則報告使用4KB。如果該文件是1025B,那麼它將報告用於1KB塊大小的2KB和用於4KB的4KB。如果文件是4097B,那麼它將在1KB塊大小上報告為5KB,在4KB塊大小上報告為8KB。

此序列演示了此行為:

$ touch foo ; du -h foo
  0B    foo
$ echo -n 1 > foo ; du -h foo
4.0K    foo

使用此命令顯示文件系統的塊大小:

tune2fs -l /dev/sda1 | grep -i 'block size'

(顯然,替換 /dev/sda1 使用適當的塊設備。)

如果它不同,那就是你的差異。

檢查確切性的更好方法 rsync 是哈希你的文件和比較。這是一個例子:

find path/media -exec openssl sha1 {} + | sort > ~/hashes

然後 diff 該 hashes 文件。


4
2018-06-28 10:22





使用時有許多不同的來源 du。校驗 man 以供參考。 我也一直面臨著這樣的問題。在手冊中,有一個選項 --apparent-size,這很好地描述了這些差異。另外 - 請注意計算大小的塊大小 du (默認值為1024字節,但可能因係統而異)。您將不得不使用顯示文件大小的命令來處理它(ls 要么 find),這就是我用來解決這個問題的方法。


2
2018-06-28 06:05





另一種可能性是 rsync--archive flag默認情況下不保留硬鏈接。如果您使用硬鏈接,那麼這也可能是您的問題。


1
2018-06-28 10:28





您很長時間以來一直在添加和刪除目錄中的文件。目錄中未鏈接文件的空間被回收,但未來的添加可能無法直接使用該空閒空間。

我認為你沒有鏡像每個文件鏈接並取消鏈接 - 這對於源來說很容易有十到二十倍的文件鏈接和取消鏈接而不是目的地 - 因此目的地不是支離破碎。

如果你執行一些超級複雜的目錄健美操,你可以減少源上目錄的大小;它看起來像這樣:

mkdir foo
mv media/* foo
rmdir media
mv foo media

請注意,這不會保存在足夠的驅動器空間附近,以使其值得。這只是一個有趣的玩具,如果那樣......


0
2018-06-27 23:52



在同一個文件系統上移動目錄有幫助嗎? AFAIK,在這種情況下僅更改分配表條目。如果我想對目錄中的文件進行碎片整理,我會改為複制。 - Iľja