diff informa que dos archivos difieren, ¡aunque son iguales!

31

Tengo dos archivos que me parecen idénticos (incluidos los espacios en blanco al final y las nuevas líneas) pero diff todavía dice que difieren. Incluso cuando hago una diff -ycomparación lado a lado, las líneas se ven exactamente iguales. La salida de diff son los 2 archivos completos.

¿Alguna idea de lo que lo está causando?

MinaHany
fuente
3
Intenta comparar caracteres no imprimibles. La forma más sencilla de verlos es sed -n l filename. Si no ayuda, agregue un ejemplo de datos y diffsalida aquí.
prisa el
1
Ahh sí, gracias, las líneas en un archivo terminan con $ y en el otro termina con \ r $
MinaHany
1
Una solución rápida es usar dos2unix en ambos archivos (o el que sospecha que es de una máquina Windows).
Chembrad
Como complemento a las respuestas existentes: el filecomando le indirecta sobre el contenido del archivo, incluyendo cosas como ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Respuestas:

29

Extraño ... ¿puedes intentarlo cmp? Es posible que desee utilizar la -bopción ' ' también.

Página de manual de cmp : compara dos archivos byte a byte.

Esta es una de las cosas buenas de Unix / Linux ... tantas herramientas :)

Levon
fuente
2
¡Gracias por eso! Obtuve: byte 19, línea 1 es 15 ^ M 12 ^ J ¿qué significa?
MinaHany
3
parece retorno de carro y salto de línea según esta tabla
Levon
2
Intenté -b con el diff y parece estar funcionando para mí. La página man dice que -bes para ignore changes in the amount of white space.
rahul.deshmukhpatil
17

¿Pueden las diferencias ser causadas por las terminaciones de línea de DOS vs. UNIX, o algo similar?

¿Y si ustedes hexdump? Esto podría mostrar diferencias más obviamente, por ejemplo:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
fuente
Bueno, los dos hexes son diferentes. cada vez que hay un 0d 0a en un archivo, el otro solo tiene 0a
MinaHany
3
En uno, tiene terminaciones de línea DOS (CRLF) y en el otro, terminaciones de línea UNIX (LF). Es por eso que se ven diferentes a diff pero no cuando los miras visualmente. Mire en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
¡Lo tengo! Muchas gracias. La sugerencia de levon de la utilización de programas cmp la diferencia más claramente aunque :)
MinaHany
17

Tratar:

diff file1 file2 | cat -t

La -topción hará catque se muestren claramente los caracteres especiales, por ejemplo. ^Mpara CR, ^Ipara tab.

Desde la página del manual (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
fuente
4

Mi primera suposición, que se confirma, es que los archivos usan diferentes finales de línea. Podría haber alguna otra diferencia en el espacio en blanco, como la presencia de espacios en blanco al final (pero normalmente no se obtendría en muchas líneas) o una sangría diferente (tabulaciones frente a espacios). Utilice un comando que imprima espacios en blanco y caracteres de control en una forma visible, como

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

Puede confirmar que las diferencias solo tienen que ver con las terminaciones de línea normalizándolas primero. Puedes tener una dos2unixutilidad; de lo contrario, elimine explícitamente el carácter CR (^ M, \ r, \ 015) adicional:

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

o, si file1es el que tiene terminaciones de DOS

 tr -d '\r' <file1 | diff - file2
Gilles 'SO- deja de ser malvado'
fuente