diff报告两个文件不同,尽管它们相同!


31

我有两个看起来和我一样的文件(包括结尾的空格和换行符),但diff仍然说它们有所不同。即使我进行diff -y并排比较,线条看起来也完全一样。diff的输出是整个2个文件。

知道是什么原因造成的吗?


3
尝试比较无法打印的字符。观看它们的最简单方法是sed -n l filename。如果没有帮助,请添加数据示例并diff在此处输出。

1
啊,是的,谢谢你,文件中的行以$结尾,而另一行以\ r $结尾
MinaHany12,2012年

1
一种快速解决方案是在两个文件(或您怀疑来自Windows计算机的文件)上使用dos2unix。
chembrad

作为对现有答案的补充:该file命令将提示您有关文件内容的信息,包括ASCII text, with CRLF line terminatorsvs 等内容ASCII text
斯特凡纳·古里科

Answers:


29

奇怪..你可以试试cmp吗?您可能也想使用' -b'选项。

cmp手册页 -逐字节比较两个文件。

这是Unix / Linux的优点之一。


2
感谢那!我得到:字节19,第1行是15 ^ M 12 ^ J是什么意思?
MinaHany

3
根据此表
Levon 2012年

2
尝试了-b与差异,它似乎为我工作。手册页说的-bignore changes in the amount of white space
rahul.deshmukhpatil,2016年

17

差异可能是由DOS与UNIX行尾或类似原因引起的吗?

如果hexdump他们呢?这可能会更明显地显示出差异,例如:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex

好吧,这两个十六进制是不同的。每次文件中有一个0d 0a时,另一个文件只有0a
MinaHany12,2012年

3
一个是DOS的行尾(CRLF),另一个是UNIX的行尾(LF)。这就是为什么它们与diff看起来不同的原因,但是当您直观地查看它们时却没有区别。看看en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb 2012年

得到它了!非常感谢。Levon建议使用cmp可以更清楚地显示差异:)
MinaHany12,2012年

17

尝试:

diff file1 file2 | cat -t

-t选项将导致cat清楚显示任何特殊字符-例如。^M对于CR,^I对于制表符。

从手册页(OS X):

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.

4

我的第一个猜测已被证实是文件使用不同的行尾。空格可能有其他差异,例如尾随空格的存在(但通常不会在很多行上得到)或不同的缩进(制表符与空格)。使用以可见形式打印出空白并控制字符的命令,例如

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

您可以通过先对其进行归一化来确认差异仅与行尾有关。您可能有dos2unix实用程序;如果不是,请显式删除多余的CR(^ M,\ r,\ 015)字符:

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

或者,如果file1是带有DOS结尾的

 tr -d '\r' <file1 | diff - file2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.