linux - 两个目录树的差异以创建文件/文件夹级别的补丁(包括二进制文件)

标签 linux compare directory patch

有很多解决方案可以为文本文件等创建文件级补丁。我正在寻找的是一个简单的脚本/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/

相关文章:

linux - 比较不同文件中文本的脚本

javascript - 推送元素时检查数组元素

JavaScript:检查/比较所有字段的值

linux - 目录具有 777 权限,但如果是 root 或用户拥有,则行为不同

c++ - 双向链表的内存泄漏

linux - 如何列出 Linux 组中的所有用户?

linux - 如何在 linux 中向文件夹添加注释并使用鼠标光标查看它们

python - 使用 pygame 将整个文件夹包含在 cx_Freeze 中

python - timeout_decorator - 是否可以禁用或使其在 Windows 上工作?

ruby - 如果\n 放在新行上,则忽略 SGR 重置代码