我有两个文件夹:
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
没有-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
' {} +
答案2
命令
rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/
将生成一个包含所需更改的批处理文件(不修改任何内容)。
该补丁可以应用于另一个站点,您可以在其中获取批处理文件,并使用
rsync --read-batch=FILE ORIGINAL/