Использовать команду diff очень просто. Вот синтаксис:
diff [options] file1 file2
Но понимание его результатов – это совсем другое. Не волнуйтесь, мы объясним вывод, чтобы вы могли сравнить два файла и понять разницу между ними.
Для начала вам понадобится пара файлов. Мы создали список, используя генератор случайных слов.
Добавил список в два разных файла, а затем изменили список:
Сохранили эти похожие файлы как 1.txt и 2.txt.
Мы предлагаем вам следовать статьи во время чтения, поэтому, пожалуйста, создайте новые файлы и добавьте к ним следующее содержимое.
Содержание 1.txt :
запись о расширении акустических
систем в паутине
Содержание 2.txt:
паутина
медальон
акустики
записей
расширения
Посмотрим, что произойдет, когда вы запустите команду diff без каких-либо опций.
andreyex:~$ diff 1.txt 2.txt 2c2 < locket --- > LOCKET 3a4 > records 5d5 < record
Смущенны? Вы не одиноки. Вывод не совсем подходит для человека. Чтобы понять, что происходит, вам нужно больше узнать о том, как работает diff.
Может быть полезно знать, что когда анализ завершен, file2 [в синтаксисе] обрабатывается как справочный документ, с которым вы пытаетесь сопоставить. Итак, вы можете сказать, что diff работает следующим образом:
diff <file_to_edit> <file_as_reference>
Это также означает, что вы получите различный вывод в зависимости от порядка размещения имен файлов.
Пример того, как выходные данные различаются в зависимости от порядка файлов:
andreyex:~$ diff 1.txt 2.txt 2c2 < locket --- > LOCKET 3a4 > records 5d5 < record andreyex:~$ diff 2.txt 1.txt 2c2 < LOCKET --- > locket 4d3 < records 5a5 > record
Используя приведенную ниже таблицу в качестве справки, вы сможете лучше понять, что происходит в вашем терминале.
Условное обозначение | Смысл |
---|---|
A | Добавлять |
С | + Изменить |
D | Удалять |
# | Номера строк |
– – – | Отдельные файлы в выводе |
< | Файл 1 |
> | Файл 2 |
Давайте еще раз посмотрим на вывод команды diff:
andreyex:~$ diff 1.txt 2.txt 2c2 < locket --- > LOCKET 3a4 > records 5d5 < record
Давайте посмотрим на первое отличие в выводе:
2c2
<locket
–
> LOCKET
Строка 2 файла 1, изменить со строкой 2 файла 2.
(Измените «locket» на «LOCKET», чтобы соответствовать файлу 2.txt)
Давайте посмотрим на следующую часть вывода:
3a4
> records
После строки 3 файла 1 добавьте строку 4 файла 2. То есть добавьте «records», чтобы создать
четвертую строку в файле 1. (чтобы файл 1.txt совпадал с файлом 2.txt)
По аналогии:
5d5
<record
Удалить текст «record» из 5-й строки файла 1.
(чтобы файл 1.txt совпадал с файлом 2.txt)
В команде нет встроенной функции проверки орфографии или словаря. Он не распознает «record» и «records» как связанные. Его единственная цель – идеально сопоставить два файла.
Глядя на результат, его все еще довольно сложно перевести. Вряд ли вы бы сэкономили много времени
К счастью, есть варианты, которые можно сделать более понятными для человека. Давайте рассмотрим несколько разных примеров, используя один и тот же список.
Опция context дает более наглядное представление о более программной информации, отображаемой по умолчанию. Давайте продолжим с нашим примером текста.
Условное обозначение | Смысл |
---|---|
+ | Добавлять |
! | + Изменить |
– | Удалять |
*** | Файл 1 |
– – – | Файл 2 |
andreyex:~$ diff -c 1.txt 2.txt *** 1.txt 2019-11-05 20:05:09.244673327 -0400 --- 2.txt 2019-11-05 20:11More:31.382547316 -0400 *************** *** 1,5 **** cobweb ! locket acoustics expansion - record --- 1,5 ---- cobweb ! LOCKET acoustics + records expansion
Намного легче понять, когда вы видите информацию таким образом. Вместо буквенно-цифрового вывода новый набор символов поможет вам быстро определить различия между двумя файлами.
Выходные данные сначала отображают первый файл, т. е. 1.txt и его строку от 1 до 5. В нем говорится, что имеется небольшое изменение (часть) строки 2 файла 1.txt и (части) строки 2 файла 2 .текст.
Это также указывает на то, что строка № 5 файла 1 была удалена (-) во втором файле.
– 1,5 —- указывает начало второго файла и говорит, что строка 2 немного отличается от строки 2 файла 1. Это также указывает, что строка 4 была добавлена (+) во второй файл, и нет соответствующей строка в файле 1.
Эта опция обеспечивает вывод, похожий на скопированный контекстный формат. Вместо того, чтобы отображать два файла по отдельности, он объединяет их вместе.
andreyex:~$ diff 1.txt 2.txt -u --- 1.txt 2019-11-05 20:05:09.244673327 -0400 +++ 2.txt 2019-11-05 20:11:31.382547316 -0400 @@ -1,5 +1,5 @@ cobweb -locket +LOCKET acoustics +records expansion -record
Как вы можете видеть, он использует те же символы, что и раньше, но вместо символа изменения он предлагает внести изменения с использованием легко читаемых + или – символов. Здесь рекомендуется удалить строку 2 из 1.txt и заменить ее строкой 2 из 2.txt.
В дальнейшем также предлагается добавить записи после строки, содержащей акустику, и удалить запись строки после строки, содержащей расширение.
Все эти изменения предлагаются для первого файла в команде diff. Это еще один сценарий, в котором полезно помнить, что программа diff использует второй файл, указанный в качестве «оригинала» или основы для исправлений.
Для сравнения такого списка считаем этот метод наиболее простым в использовании. Это дает вам четкую визуализацию текста, который необходимо изменить, чтобы сделать файлы идентичными.
Поиск с учетом регистра по умолчанию используется для diff, но вы можете отключить его. Давайте посмотрим, что происходит, когда вы это делаете.
andreyex:~$ diff 1.txt 2.txt -i 3a4 > records 5d5 < record
Как видите, «locket» и «LOCKET» больше не перечислены в качестве предлагаемых изменений.
Вы можете использовать –color для выделения изменений в выводе команды diff. Когда команда запущена, разделы вывода будут напечатаны разными цветами из палитры терминала.
Есть несколько простых способов проверить, идентичны ли файлы. Если вы используете -s, он скажет вам, что файлы идентичны, или он будет работать как обычно.
Использование -q только скажет вам, что файлы «отличаются». Если они этого не сделают, вы не получите никакого выхода.
andreyex:~$ diff 1.txt 1.txt -s Files 1.txt and 1.txt are identical andreyex:~$ diff 1.txt 2.txt -q Files 1.txt and 2.txt differ
Возможно, вы не всегда сравниваете такую простую информацию. У вас могут быть большие текстовые файлы для сканирования и поиска различий. Мы опишем несколько методов для решения этого типа проблемы.
Для этого примера мы создали два файла с большими кусками текста (lorem ipsum). Каждая строка имеет сотни столбцов. Это явно затрудняло сравнение строк.
Когда diff запускается для файла, подобного этому, выходные данные генерируют огромные куски текста, и символы трудно увидеть даже с помощью таких инструментов, как контекстный вывод.
Вы можете использовать одни и те же понятия для анализа файлов такого типа. Они не будут работать хорошо, если файл не отформатирован должным образом. Некоторые большие блоки текста не имеют разрывов строк. Вероятно, вы столкнулись с таким файлом, где вам нужно было включить «перенос слов», чтобы весь текст отображался в выделенном пространстве без использования полосы прокрутки. Причина в том, что некоторые текстовые форматы не создают разрывы строк автоматически. Вот так вы получите большие куски текста всего в 2-3 строки. Это довольно легко исправить.
Команда fold используется для разбиения строк по количеству столбцов. Это может быть настроено, чтобы дать вам варианты того, как эти новые разрывы строк реализованы.
В приведенном здесь примере вы собираетесь разделить файл на стандартизированную ширину и использовать опцию -s. Это говорит программе прерывать ТОЛЬКО там, где есть пробел, а не в середине текста.
fold -w 80 -s lorem.txt > lorem.txt fold -w 80 -s lorem2.txt > lorem2.txt
Когда оба файла разбиты на 31 строку вместо 3, вы можете сравнивать их гораздо эффективнее.
Вы можете сделать это немного легче читать с помощью тега –minimal. Это делает большие текстовые файлы немного легче для чтения. Давайте посмотрим на вывод.
andreyex:~$ diff lorem.txt 2lorem.txt --minimal 4c4 < eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. --- > eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 7c7 < Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, --- > Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 24c24 < a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at --- > a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at
Вы можете комбинировать любые из этих советов или использовать некоторые другие опции, перечисленные на страницах справки diff. Это мощная и простая в использовании программная утилита.
Мы надеемся, что вы нашли эту статью полезной. Если у вас есть совет, не забудьте оставить нам комментарий и рассказать нам об этом.
Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!
Спасибо! Ваша заявка принята
Спасибо! Ваша заявка принята
Отличная статья
спасибо!