我需要对非 ASCII 且没有换行符的文件进行比较。理想情况下,我希望看到新增内容、删除内容、修改内容,也许还可以看到与其他文件不同的比例(百分比、大小)
问题是,似乎diff
只告诉我有关删除/添加的行,在我的情况下谁是问题。它似乎对非 ASCII 文件表现不佳,试图将它们显示为 ASCII,因此不显示任何相关数据
答案1
diff
仅适用于文本文件。要对二进制文件运行 diff,首先需要将它们转换为文本,例如使用xxd
或hexdump
。这很容易即时完成流程替代。
例如
$ cat file1
A B C D E
$ cat file2
A B X D E
$ diff -u <(xxd file1) <(xxd file2)
--- /dev/fd/63 2022-03-06 15:40:23.811027810 +1100
+++ /dev/fd/62 2022-03-06 15:40:23.811027810 +1100
@@ -1 +1 @@
-00000000: 4120 4220 4320 4420 450a A B C D E.
+00000000: 4120 4220 5820 4420 450a A B X D E.
是的,file1 和 file2 是文本文件,但文本文件是恰好只包含“文本”字符的二进制文件的子集。为本示例创建文本文件更容易。
值得注意的是:即使二进制文件中的微小变化(例如添加或删除一个字节)也可能导致 的diff
输出巨大。这是因为在这个微小的变化之后, xxd
or的每一行hexdump
输出都会不同。因此不建议这样做。你可以将 diff 的输出重定向到 /dev/null 并检查退出代码,但如果您只想知道文件是否不同,最好直接运行cmp
。
解决方案:使用二进制 diff 工具,如下所示的工具之一,该工具通常用于生成二进制文件的补丁文件。例如:
$ apropos diff | grep binary
radiff2 (1) - unified binary diffing utility
bsdiff (1) - generate a patch between two binary files
xdelta3 (1) - VCDIFF (RFC 3284) binary diff tool
例如
$ radiff2 file1 file2
0x00000004 43 => 58 0x00000004
$
radiff2 还有一个 unidiff 输出选项,它可能更具可读性(不过,我不知道输出是否比xxd
两个大文件的比较转储小):
$ radiff2 -u file1 file2
-0x00000004:43 "C D E\n"
+0x00000004:58 "X D E\n"
如果文件相同,radiff2 将不会输出任何内容:
$ radiff2 file1 file1
$
答案2
在我使用的命令行上绑定差异。