it-swarm-eu.dev

diff sestavy dva soubory se liší, i když jsou stejné!

Mám dva soubory, které vypadají stejně jako já (včetně koncových mezer a nových řádků), ale diff stále říká, že se liší. I když udělám diff -y vedle sebe vypadají řádky přesně stejně. Výstupem z rozdílu jsou celé 2 soubory.

Nějaký nápad, co to způsobuje?

34
MinaHany

Zvláštní ... můžete zkusit cmp? Možná budete chtít použít '-b 'možnost.

cmp man page - Porovnejte dva bajty souborů byte.

Toto je jedna z pěkných věcí o Unixu/Linuxu. Tolik nástrojů :)

29
Levon

Snaž se:

diff file1 file2 | cat -t

Volba -t Způsobí, že cat jasně zobrazí nějaké speciální znaky - např. ^M Pro CR, ^I Pro kartu.

Z manuálové stránky (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

Mohou být rozdíly způsobeny koncovkami řádků DOS vs. UNIX nebo podobnými?

Co když je hexdump? To by mohlo jasně ukázat rozdíly, např .:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
17
mrb

Můj první odhad, který se ukáže být potvrzen, je, že soubory používají různé konce řádků. Může to být nějaký jiný rozdíl v mezerách, jako je přítomnost koncové mezery (ale obvykle byste to nedostali na mnoha řádcích) nebo různé odsazení (karty vs. mezery). Použijte příkaz, který vytiskne mezery a kontroluje znaky ve viditelné formě, například

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

Můžete potvrdit, že rozdíly mají co do činění pouze s koncovkami řádků, a to nejprve normalizací. Můžete mít dos2unix utility; pokud ne, odstraňte výslovně znak CR (^ M,\r,\015):

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

nebo když file1 je ten s koncovkami DOSu

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