没有换行符的文件上的“diff”

没有换行符的文件上的“diff”

我需要对非 ASCII 且没有换行符的文件进行比较。理想情况下,我希望看到新增内容、删除内容、修改内容,也许还可以看到与其他文件不同的比例(百分比、大小)

问题是,似乎diff只告诉我有关删除/添加的行,在我的情况下谁是问题。它似乎对非 ASCII 文件表现不佳,试图将它们显示为 ASCII,因此不显示任何相关数据

答案1

diff仅适用于文本文件。要对二进制文件运行 diff,首先需要将它们转换为文本,例如使用xxdhexdump。这很容易即时完成流程替代

例如

$ 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输出巨大。这是因为在这个微小的变化之后, xxdor的每一行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

在我使用的命令行上绑定差异

相关内容