Когда вам нужно сравнить два файла, содержащие похожий текст в Linux, использование команды diff может значительно облегчить вашу задачу. Команда сравнивает два файла, чтобы предложить изменения, которые сделают файлы идентичными. Отлично подходит для поиска той дополнительной фигурной скобки, которая сломала ваш недавно обновленный код.
Использовать команду 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. Это мощная и простая в использовании программная утилита.
Мы надеемся, что вы нашли эту статью полезной. Если у вас есть совет, не забудьте оставить нам комментарий и рассказать нам об этом.
Отличная статья
спасибо!