Rsync
如何保存更改的文件?
我有兩個文件夾:
- 原版的/
- ORIGINAL_AND_MY_CHANGES/
我的朋友有一份 ORIGINAL/。我想生成 MY_CHANGES.tgz - 與 ORIGINAL/ 相比,它應該只包含 ORIGINAL_AND_MY_CHANGES/ 中的新/更改文件。因此,我的朋友可以將其解壓縮到他的 ORIGINAL/ 副本中並獲得 ORIGINAL_AND_MY_CHANGES/。我怎樣才能做到這一點?
PS 我試過
diff
了,但它不能保存二進制數據,而且rsync --link-dest
——它會生成在存檔中無用的硬連結。PPS 在我的情況下,修改時間不能用來決定哪個文件被改變了。
使用 rsync
您所做的本質上是增量備份:您的朋友(您的備份)已經擁有原始文件,並且您想要製作一個包含您從該原始文件更改的文件的存檔。
Rsync具有增量備份功能。
cd ORIGINAL_AND_MY_CHANGED rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
-a
意味著保留所有屬性(時間、所有權等)。-c
表示比較文件內容而不依賴於日期和大小。--compare-dest=/some/directory
表示該目錄下與原始碼樹相同的文件不會被複製。請注意,路徑是相對於目標目錄的。Rsync 複製所有目錄,即使那裡沒有文件。要擺脫這些空目錄,請執行
find -depth CHANGES_ONLY -type d -empty -delete
(或者如果您find
沒有-delete
and-empty
,請執行find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null
)。然後從
CHANGES_ONLY
目錄製作存檔。人行道
使用您的文件遍歷目錄。跳過與原始文件相同的文件。根據需要在目標中創建目錄。複製更改的文件。
cd ORIGINAL_AND_MY_CHANGES find . \! -type d -exec sh -c ' for x; do if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi [ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}" cp -p "$x" "../CHANGES_ONLY/$x" done ' {} +