有很多解决方案可以为文本文件等创建文件级补丁。我正在寻找的是一个简单的脚本/ shell命令,它将比较oldversion / newversion /并给我一个文件树,我需要复制oldversion以使其等于newversion(假设文件未在更新中删除)版)。请注意,这两个文件夹包含二进制文件和文本文件。
以前,我们使用的是黑客:
fdupes -qrf newversion/ oldversion/ | grep "newversion" | xargs rm;
让我们留下可以打包成补丁的文件夹“newversion”。
不幸的是,这结果是灾难性的,因为fdupes不考虑文件名。
有什么好处就像fdupes一样,实际上包含了比较中的文件名。
答案 0 :(得分:5)
可以要求diff命令输出不同的文件名。
diff --quiet --recurse --unidirectional-new-file OLDDIR NEWDIR
Files old/main and new/main differ
Files old/main.cpp and new/main.cpp differ
Files old/Makefile and new/Makefile differ
Files old/sounds/popalien.wav and new/sounds/popalien.wav differ
Files old/sounds/saucer.wav and new/sounds/saucer.wav differ
当然,这不是一个很好的输出,但是由于你只是在寻找新的文件来打包作为补丁,快速的sed管道可以创造奇迹:
diff --quiet --recurse -unidirectional-new-file OLDDIR NEWDIR | \
sed "s/^.* and \(.*\) differ/\1/"
(为便于阅读而破损)
new/main
new/main.cpp
new/Makefile
new/sounds/popalien.wav
new/sounds/saucer.wav
'和'之前的空格和'不同'之前
diff的操作数的ORDER有所不同,第一个参数留下'和',第二个参数留在后面。请注意这一点。
此外,如果您从NEWDIR删除文件,则不会找到它,只会添加或更改文件。要同时输出在subdir中找不到的文件的文件名,请将--unidirection-new-file替换为--new-file。 (除了--unidirectional ..之外的所有短选项都存在。)
答案 1 :(得分:1)
diff -ruN oldversion newversion
答案 2 :(得分:0)
我知道已经很久了。我需要相同的解决方案我找到了这篇文章,但这还不够。然后我发现rsync
可以完成IFF你``patch``相同的副本,并且不需要与其他更改合并。我打算用它来更新断开连接的机器上的yum镜像。我的完整解决方案涉及更多,我正在从内存中编写命令,所以一些细节可能是错误的,但核心是:
# create identical copy "copy.0"
rsync -a master/ copy.0/
# Presumably transfer copy.0/ to another machine for offline use
# but copy.0 must not mutate outside of this process or sync probably
# will not work.
# some time later update master, e.g. rsync master from upstream mirror
# mutates master in some way, changes/adds/removes remove files including
# binaries
echo -n $'\001\002' > master/new.bin
rm master/gone.bin
# generate rsync batch that can be used to ``patch`` copy.0
# to become identical to master
rsync -a --delete --itemize-changes --only-write-batch=copy.0.batch \
master/ copy.0/
# now the file copy.0.batch contains only the deltas to be applied
# transfer the batch file to where it needs to be applied
# apply the batch to copy.0
rsync -a --delete --itemize-changes --read-batch=copy.0.batch copy.0/
这会处理删除和许多其他事情,可能权限,时间戳等,但我认为它可能无法将硬链接作为硬链接处理,并且可能会将它们创建为单独的未链接文件。