diff rapporte que deux fichiers diffèrent, bien qu'ils soient identiques!

31

J'ai deux fichiers qui me semblent identiques (y compris les espaces de fin et les nouvelles lignes) mais diff dit toujours qu'ils diffèrent. Même lorsque je fais une diff -ycomparaison côte à côte, les lignes se ressemblent exactement. La sortie de diff est l'ensemble des 2 fichiers.

Une idée de la cause?

MinaHany
la source
3
Essayez de comparer les caractères non imprimables. La façon la plus simple de les regarder est sed -n l filename. Si cela n'aide pas, ajoutez un exemple de données et diffsortez ici.
rush
1
Ahh oui merci, les lignes dans un fichier se terminent par $ et dans l'autre se terminant par \ r $
MinaHany
1
Une solution rapide consiste à utiliser dos2unix sur les deux fichiers (ou sur celui que vous pensez provenir d'une machine Windows).
chembrad
En complément aux réponses existantes: la filecommande vous indice sur le contenu des fichiers, y compris des choses comme ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Réponses:

29

Odd .. pouvez-vous essayer cmp? Vous voudrez peut-être utiliser le '-b option '.

page de manuel cmp - Compare deux fichiers octet par octet.

C'est l'une des bonnes choses à propos d'Unix / Linux .. tant d'outils :)

Levon
la source
2
Merci pour ça! J'ai: octet 19, la ligne 1 est 15 ^ M 12 ^ J qu'est-ce que cela signifie?
MinaHany
3
ressemble à retour chariot et saut de ligne selon ce tableau
Levon
2
essayé -b avec le diff et il semble fonctionner pour moi. la page de manuel indique que -bc'est pour ignore changes in the amount of white space.
rahul.deshmukhpatil
17

Les différences peuvent-elles être causées par des fins de ligne DOS ou UNIX, ou quelque chose de similaire?

Et si vous hexdumpeux? Cela pourrait montrer des différences plus évidentes, par exemple:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
mrb
la source
Eh bien, les deux hexagones sont différents. chaque fois qu'il y a un 0d 0a dans un fichier, l'autre n'a que 0a
MinaHany
3
Dans l'un, vous avez des fins de ligne DOS (CRLF) et dans l'autre, des fins de ligne UNIX (LF). C'est pourquoi ils sont différents des différences, mais pas lorsque vous les regardez visuellement. Regardez en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
Je l'ai! Merci beaucoup. La suggestion de Levon d'utiliser cmp montre la différence plus clairement cependant :)
MinaHany
17

Essayer:

diff file1 file2 | cat -t

L' -toption fera catapparaître clairement tous les caractères spéciaux - par exemple. ^Mpour CR,^I pour tab.

Depuis la page de manuel (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
la source
4

Ma première supposition, qui s'avère être confirmée, est que les fichiers utilisent des fins de ligne différentes. Il pourrait y avoir une autre différence dans les espaces, comme la présence d'espaces de fin (mais vous n'obtiendrez généralement pas cela sur de nombreuses lignes) ou une indentation différente (tabulations vs espaces). Utilisez une commande qui imprime des espaces et contrôle les caractères sous une forme visible, telle que

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

Vous pouvez confirmer que les différences ne concernent que les fins de ligne en les normalisant d'abord. Vous pouvez avoir un dos2unixutilitaire; sinon, supprimez explicitement le caractère CR (^ M, \ r, \ 015) supplémentaire:

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

ou, si file1c'est celui avec des terminaisons DOS

 tr -d '\r' <file1 | diff - file2
Gilles, arrête de faire le mal
la source