diff meldet, dass sich zwei Dateien unterscheiden, obwohl sie gleich sind!

31

Ich habe zwei Dateien, die für mich identisch aussehen (einschließlich nachfolgender Leerzeichen und Zeilenumbrüche), aber diff sagt immer noch, dass sie sich unterscheiden. Selbst wenn ich einen diff -yNebeneinander-Vergleich mache , sehen die Linien genau gleich aus. Die Ausgabe von diff sind die gesamten 2 Dateien.

Irgendeine Idee, woran es liegt?

MinaHany
quelle
3
Versuchen Sie, nicht druckbare Zeichen zu vergleichen. Der einfachste Weg, sie zu sehen, ist sed -n l filename. Wenn es nicht hilft, fügen Sie ein Datenbeispiel hinzu und diffgeben Sie es hier aus.
Ansturm
1
Ahh ja danke, die Zeilen in einer Datei enden mit $ und in der anderen mit \ r $
MinaHany
1
Eine schnelle Lösung besteht darin, dos2unix für beide Dateien (oder für die Dateien, von denen Sie vermuten, dass sie von einem Windows-Computer stammen) zu verwenden.
Chembrad
Als Ergänzung zu den bestehenden Antworten: Der fileBefehl wird Sie über Datei - Inhalt andeuten, einschließlich solcher Dinge wie ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Antworten:

29

Odd .. kannst du es versuchen cmp? Möglicherweise möchten Sie auch die -bOption ' ' verwenden.

cmp man page - Vergleicht zwei Dateien byteweise.

Dies ist eines der schönen Dinge über Unix / Linux .. so viele Tools :)

Levon
quelle
2
Dank dafür! Ich habe: Byte 19, Zeile 1 ist 15 ^ M 12 ^ J was bedeutet das?
MinaHany
3
sieht aus wie Wagenrücklauf und Zeilenvorschub nach dieser Tabelle
Levon
2
habe -b mit dem diff ausprobiert und es scheint für mich zu funktionieren. Manpage sagt -bist für ignore changes in the amount of white space.
rahul.deshmukhpatil
17

Könnten die Unterschiede durch DOS- oder UNIX-Zeilenenden oder ähnliches verursacht werden?

Was ist, wenn Sie hexdumpsie? Dies könnte deutlicher Unterschiede aufzeigen, zB:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
quelle
Nun, die beiden Felder sind unterschiedlich. Jedes Mal, wenn eine Datei 0d 0a enthält, hat die andere 0a
MinaHany
3
In einer haben Sie DOS-Zeilenenden (CRLF) und in der anderen UNIX-Zeilenenden (LF). Das ist der Grund, warum sie unterschiedlich aussehen, aber nicht, wenn Sie sie visuell betrachten. Schauen Sie sich en.wikipedia.org/wiki/Newline#Conversion_utilities
Mrb
Ich habs! Vielen Dank. Levons Vorschlag, cmp zu verwenden, zeigt den Unterschied jedoch deutlicher :)
MinaHany
17

Versuchen:

diff file1 file2 | cat -t

Die -tOption bewirkt cat, dass Sonderzeichen deutlich angezeigt werden - z. ^Mfür CR, ^Ifür tab.

Aus der Manpage (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.
JosephH
quelle
4

Meine erste Vermutung, die sich als bestätigt herausstellt, ist, dass die Dateien unterschiedliche Zeilenenden verwenden. Es kann sich auch um einen anderen Unterschied zwischen Leerzeichen handeln, z. B. um das Vorhandensein von nachgestellten Leerzeichen (dies wird jedoch normalerweise nicht in vielen Zeilen angezeigt) oder um einen anderen Einzug (Tabulatoren oder Leerzeichen). Verwenden Sie einen Befehl, der Leerzeichen und Steuerzeichen in sichtbarer Form ausgibt, z

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

Sie können bestätigen, dass die Unterschiede nur mit Zeilenenden zu tun haben, indem Sie diese zuerst normalisieren. Möglicherweise haben Sie ein dos2unixDienstprogramm. Wenn nicht, entfernen Sie das zusätzliche CR-Zeichen (^ M, \ r, \ 015) explizit:

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

oder, wenn file1es das mit DOS-Endungen ist

 tr -d '\r' <file1 | diff - file2
Gilles 'SO - hör auf böse zu sein'
quelle