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?
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ů :)
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.
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
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