Dmi*_*try 8 diff rsync file-copy
我有两个文件夹:
我的朋友有一份 ORIGINAL/。我想生成 MY_CHANGES.tgz - 与 ORIGINAL/ 相比,它应该只包含来自 ORIGINAL_AND_MY_CHANGES/ 的新文件/更改文件。所以我的朋友可以将它解压到他的 ORIGINAL/ 副本中并获得 ORIGINAL_AND_MY_CHANGES/。我怎样才能做到这一点?
PS 我试过了,diff但它不能保存二进制数据,而且rsync --link-dest——它会生成在存档中无用的硬链接。
PPS 在我的情况下,不能使用修改时间来决定更改了哪个文件。
您所做的本质上是增量备份:您的朋友(您的备份)已经拥有原始文件,并且您想要制作一个包含您从原始文件更改的文件的存档。
Rsync具有增量备份功能。
cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
Run Code Online (Sandbox Code Playgroud)
-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
' {} +
Run Code Online (Sandbox Code Playgroud)
命令
rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/
Run Code Online (Sandbox Code Playgroud)
将生成一个包含所需更改的批处理文件(不修改任何内容)。
该补丁可以应用在另一个站点上,您可以在其中获取批处理文件,
rsync --read-batch=FILE ORIGINAL/
Run Code Online (Sandbox Code Playgroud)