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

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

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

27 голосов | спросил MinaHany 17 PM00000050000002331 2012, 17:16:23

4 ответа


23

Нечетный .. вы можете попробовать cmp? Возможно, вы захотите использовать параметр «-b».

справочная страница cmp - Сравните два байта по байтам.

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

ответил Levon 17 PM00000050000002631 2012, 17:20:26
17

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

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

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
ответил mrb 17 PM00000050000000131 2012, 17:22:01
9

Try:

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.
ответил JosephH 4 WedEurope/Moscow2013-12-04T21:12:49+04:00Europe/Moscow12bEurope/MoscowWed, 04 Dec 2013 21:12:49 +0400 2013, 21:12:49
4

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

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

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

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

или, если file1 - это номер с окончанием DOS

 tr -d '\r' <file1 | diff - file2
ответил Gilles 18 AM00000040000002431 2012, 04:00:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132