cmp -l 如何显示差异?

k31*_*159 4 linux gnu

我正在使用cmp (GNU diffutils) 3.7并且对cmp -l/--verbose(“输出字节数和不同的字节值”)的输出感到困惑。

除了开头的几个字节外,我有两个几乎相同的文件:

$ ls -n x*
-rw-rw-r-- 1 1000 1000 345776 Jun 16 10:41 x-6.xz
-rw-rw-r-- 1 1000 1000 345776 Jun 16 10:04 x-9.xz
$ hexdump -C x-6.xz | head -3
00000000  fd 37 7a 58 5a 00 00 04  e6 d6 b4 46 02 00 21 01  |.7zXZ......F..!.|
00000010  16 00 00 00 74 2f e5 a3  e2 1c bb ef ff 5d 00 39  |....t/.......].9|
00000020  18 4a a7 22 04 94 b3 4a  c8 bc d2 00 4b 8c be aa  |.J."...J....K...|
$ hexdump -C x-9.xz | head -3
00000000  fd 37 7a 58 5a 00 00 04  e6 d6 b4 46 02 00 21 01  |.7zXZ......F..!.|
00000010  1c 00 00 00 10 cf 58 cc  e2 1c bb ef ff 5d 00 39  |......X......].9|
00000020  18 4a a7 22 04 94 b3 4a  c8 bc d2 00 4b 8c be aa  |.J."...J....K...|
$ diff <(hexdump -C x-6.xz) <(hexdump -C x-9.xz)
2c2
< 00000010  16 00 00 00 74 2f e5 a3  e2 1c bb ef ff 5d 00 39  |....t/.......].9|
---
> 00000010  1c 00 00 00 10 cf 58 cc  e2 1c bb ef ff 5d 00 39  |......X......].9|
$ 
Run Code Online (Sandbox Code Playgroud)

当我这样做时,令我感到困惑的是cmp -l

$ cmp -l x-6.xz x-9.xz 
    17  26  34
    21 164  20
    22  57 317
    23 345 130
    24 243 314
$ 
Run Code Online (Sandbox Code Playgroud)

似乎是说字节 17 在 x-6.xz 中具有值 26,在 x-9.xz 中具有值 34。这是错误的:实际上,字节 16(即 0x10)具有值 0x16 和 0x1c(分别为 22 和 28)。此外,cmp 说字节 23 的值为 345。一个字节怎么可能大于 255?我一定误解了输出的含义,但man cmp似乎没有说明它是什么。

Ste*_*itt 10

cmp 从 1 开始计算偏移量并以八进制显示字节值

17  26  34
Run Code Online (Sandbox Code Playgroud)

表示偏移量 17 处的字节(hexdump输出中的0x10 ,因为它从 0 开始)在第一个文件中具有八进制值 026,十进制 22,在第二个文件中具有八进制值034,十进制 28。

  • 谢谢!如今八进制的使用非常罕见,我经常忘记许多实用程序仍然使用它来向后兼容。 (3认同)