diff сообщает, что два файла отличаются друг от друга, хотя они одинаковы!

У меня есть два файла, которые выглядят идентично мне (включая конечные пробелы и новые строки), но diff все еще говорит, что они отличаются. Даже когда я сравниваю сравнение друг с другом, линии выглядят точно так же. Вывод из diff – это всего 2 файла.

Любая идея, что его вызывает?

Нечетный .. вы можете попробовать cmp ? Вы также можете использовать опцию ' -b '.

cmp man page – Сравнить два байта по байтам.

Это одна из приятных вещей о Unix / Linux .. так много инструментов 🙂

Могут ли различия быть вызваны окончаниями DOS или UNIX, или что-то подобное?

Что делать, если вы их используете? Это может показать различия более явно, например:

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

Пытаться:

 diff file1 file2 | cat -t 

Параметр -t заставит cat четко показать какие-либо специальные символы – например. ^M для CR, ^I для вкладки.

На странице man (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. 

Моя первая догадка, которая, как оказалось, подтверждается, заключается в том, что файлы используют разные концы строк. Это может быть какая-то другая разница в пробелах, такая как наличие конечных пробелов (но вы, как правило, не получаете этого на многих строках) или разные отступы (вкладки и пробелы). Используйте команду, которая выводит пробелы и управляет символами в видимой форме, например

 diff <(cat -A file1) <(cat -A file2) diff <(sed -nl file1) <(sed -nl file2) 

Вы можете подтвердить, что различия связаны только с окончанием строк, сначала нормализуя их. У вас может быть утилита dos2unix ; если нет, удалите лишний символ CR (^ M, \ r, \ 015):

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

или, если file1 – тот, у которого заканчиваются DOS

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