Rsync

如何保存更改的文件?

  • November 23, 2011

我有兩個文件夾:

  • 原版的/
  • 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沒有-deleteand -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
' {} +

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