diff relata que dois arquivos são diferentes, embora sejam os mesmos!

30

Eu tenho dois arquivos que parecem idênticos a mim (incluindo espaços em branco à direita e novas linhas), mas diff ainda diz que eles diferem. Mesmo quando faço uma comparação diff -y lado a lado, as linhas parecem exatamente as mesmas. A saída do diff é o conjunto de 2 arquivos.

Alguma ideia do que está causando isso?

    
por MinaHany 17.08.2012 / 15:16

4 respostas

29

Estranho .. você pode tentar cmp ? Você pode querer usar a opção ' -b ' também.

página man do cmp - Compare dois arquivos byte por byte.

Esta é uma das coisas legais sobre o Unix / Linux .. tantas ferramentas:)

    
por 17.08.2012 / 15:20
17

As diferenças podem ser causadas por finais de linha do DOS versus UNIX ou algo semelhante?

E se você hexdump deles? Isso pode mostrar diferenças mais obviamente, por exemplo:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
    
por 17.08.2012 / 15:22
11

Tente:

diff file1 file2 | cat -t

A opção -t fará com que cat mostre claramente todos os caracteres especiais - por exemplo. ^M para CR, ^I para tabulação.

Da página do 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.
    
por 04.12.2013 / 18:12
5

Meu primeiro palpite, que acaba por ser confirmado, é que os arquivos usam diferentes finais de linha. Pode haver outra diferença no espaço em branco, como a presença de espaços em branco à direita (mas você normalmente não obteria isso em muitas linhas) ou recuos diferentes (tabulações versus espaços). Use um comando que imprima espaços em branco e controle os caracteres de forma visível, como

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

Você pode confirmar que as diferenças só têm a ver com os términos de linha normalizando-os primeiro. Você pode ter um utilitário dos2unix ; se não, remova o caractere extra CR (^ M, \ r, \ 015) explicitamente:

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

ou, se file1 for aquele com finais do DOS

 tr -d '\r' <file1 | diff - file2
    
por 18.08.2012 / 02:00

Tags