разность сообщает, что два файла отличаются, хотя они - то же!

Необходимо установить ntfs-3g драйвер файловой системы и смонтировать диск с помощью этого вместо текущего ntfs драйвера.

31
04.12.2013, 19:40
7 ответов

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

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

Это - одна из хороших вещей о Unix/Linux.. столько инструментов :)

29
27.01.2020, 19:37
  • 1
    Спасибо за это! Я добрался: байт 19, строка 1 является 15 ^M 12 ^J что это означает?, –  MinaHany 17.08.2012, 16:22
  • 2
    похож на возврат каретки и перевод строки согласно этой таблице –  Levon 17.08.2012, 16:25
  • 3
    попробовал-b разностью, и это, кажется, работает на меня. в странице справочника говорится -b для ignore changes in the amount of white space. –  rahul.deshmukhpatil 26.08.2016, 09:22

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

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

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
17
27.01.2020, 19:37
  • 1
    ну, два шестнадцатеричных числа отличаются. каждый раз существует 0d 0a в файле, другой просто имеет 0a –  MinaHany 17.08.2012, 16:29
  • 2
    В одном у Вас есть окончания строки DOS (CRLF) и в другом, окончания строки UNIX (LF). Вот почему они кажутся другими разности, но не, когда Вы смотрите на них визуально. Взгляд на en.wikipedia.org/wiki/Newline#Conversion_utilities –  mrb 17.08.2012, 16:32
  • 3
    Получил его!Большое спасибо. Предложение Levon использования cmp показывает различие более ясно хотя :) –  MinaHany 17.08.2012, 16:39

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

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

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

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

или, если file1 тот с окончаниями DOS

 tr -d '\r' <file1 | diff - file2
4
27.01.2020, 19:37

Попытка:

diff file1 file2 | cat -t

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

Из страницы справочника (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.
18
27.01.2020, 19:37

Другие ответы достаточно полны, но предоставляют способы явного отображения невидимых различий. Впрочем, есть еще вариант :с игнорированием этих различий, которые как-то неважны. В некоторых случаях знать об этих различиях бесполезно.

Команда

diffимеет несколько полезных опций, касающихся этого:

--strip-trailing-cr
    strip trailing carriage return on input

-B, --ignore-blank-lines
    ignore changes where lines are all blank

-Z, --ignore-trailing-space
    ignore white space at line end

Лично я нашел --strip-trailing-crполезным, особенно при использовании-r(т. е. опции--recursive)в больших проектах или когдаcore.autocrlfGit неfalse(т. е. trueилиinput).

Для получения дополнительной информации об этих и других параметрах см. его справочную страницу(или черезman diff).

Примечание.:Использование этих параметров влияет на скорость получения результатов, особенно в случае больших файлов/каталогов. В одном из моих собственных случаев это увеличило время манипуляции с 0.321sдо 0.422s.

1
25.04.2020, 19:06

Для всех пользователей Windows это можно сделать с помощью fc. Он может использовать бинарное сравнение.

fc /B file1 file2
1
18.11.2020, 14:38

В окне со стороны -и -со стороны добавьте --suppress-common-linesк опциям.

Все другие ответы и комментарии здесь полезно знать, но их недостаточно . Исходный вопрос явно о стороне -путем сравнения -стороны . Даже файлы, созданные с помощью cp, будут полностью перечислены в стороне -по -в стороннем режиме -, все проблемы с переводом строки, пробелами или специальными символами в стороне. Вам всегда понадобится --suppress-common-lines, чтобы получить желаемый результат.

Это может быть неочевидно для неанглоязычных носителей, так как common может интерпретироваться как «нормальный», а не как «взаимный». Возможно, было бы проще, если бы было сказано «подавить -равные -строки» или подобное.И меня очень удивило, что для такой «общей» :)задачи не было короткого, однобуквенного варианта.

0
03.01.2021, 12:02

Теги

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