web-dev-qa-db-fra.com

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

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 quand je fais un diff -y comparaison 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?

34
MinaHany

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

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

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

29
Levon

Essayer:

diff file1 file2 | cat -t

Le -t l'option fera que cat affichera clairement tous les caractères spéciaux - par exemple. ^M pour CR, ^I pour l'onglet.

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.
17
JosephH

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

Et si vous hexdump eux? 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
17
mrb

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 en fin (mais vous n'obtiendrez généralement pas cela sur plusieurs 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 dos2unix utilitaire; sinon, supprimez explicitement le caractère CR (^ M,\r,\015) supplémentaire:

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

ou si file1 est celui avec des terminaisons DOS

 tr -d '\r' <file1 | diff - file2