如何保存更改的文件?

如何保存更改的文件?

我有两个文件夹:

ORIGINAL/
ORIGINAL_AND_MY_CHANGES/

我的朋友有一份ORIGINAL/.我想生成MY_CHANGES.tgz- 它应该只包含ORIGINAL_AND_MY_CHANGES/ORIGINAL/.所以我的朋友可以将其解压到他的副本中ORIGINAL/并获取ORIGINAL_AND_MY_CHANGES/.

我怎样才能做到这一点?

PS 我尝试过,diff但它无法保存二进制数据,而且rsync --link-dest它会生成在存档中无用的硬链接。

PPS 就我而言,修改时间不能用于决定更改了哪个文件。

答案1

使用 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
' {} +

答案2

命令

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

将生成一个包含所需更改的批处理文件(不修改任何内容)。

该补丁可以应用于另一个站点,您可以在其中获取批处理文件,并使用

rsync --read-batch=FILE ORIGINAL/

相关内容