有很多解决方案可以为文本文件等创建文件级补丁。我正在寻找的是一个简单的脚本/shell 命令,它将比较旧版本/新版本/并给我一棵文件树,我需要复制旧版本以使其等于新版本(假设文件未在更新中删除版本)。请注意,这两个文件夹同时包含二进制文件和文本文件。
之前,我们使用的是 hack:
fdupes -qrf newversion/oldversion/| grep“新版本” | xargs rm;
留给我们可以打包为补丁的文件夹“newversion”。
不幸的是,这结果是灾难性的,因为 fdupes 不考虑文件名。
如果像 fdupes 这样的东西确实在比较中包含了文件名,那就太棒了。
最佳答案
可以要求 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
“and”和“differ”之前的空格
diff 的操作数的顺序有所不同,第一个参数在 ' 和 ' 的左边,第二个在之后。小心这一点。
另外,如果你从 NEWDIR 中删除一个文件,这将不会按给定的方式找到它,只能找到添加或更改的文件。要同时输出在任一子目录中都找不到的文件的文件名,请将 --unidirection-new-file 替换为 --new-file。 (除 --unidirectional.. 之外的所有选项都存在短选项)
关于linux - 两个目录树的差异以创建文件/文件夹级别的补丁(包括二进制文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508035/