Сравнение файлов в Linux для веб-разработчика. Сравнение файлов в Linux (команда diff) Diff linux примеры

Обычно diff генерирует вывод следующего формата:

$ diff file1 file2 2c2 < Helllo --- > Hello

Но существует специальный параметр командной строки (-y), который сообщает утилите о необходимости вывода данных в двух отдельных столбцах. А это пример такого вывода:

$ diff -y file1 file2 Hi Hi Helllo | Hello Bye Bye

Очевидно, что при использовании данного формата вывода символ "|" используется для маркировки отличающихся строк.

5. Сокрытие идентичных строк

Если вы внимательно рассмотрите вывод из предыдущего примера (из расположенного выше раздела 4), вы обнаружите, что при использовании параметра командной строки -y утилита diff выводит не только измененные, но и идентичные строки обрабатываемых файлов. В том случае, если вам нужно убрать идентичные строки из вывода, вы можете воспользоваться параметром --suppress-common-lines .

$ diff -y --suppress-common-lines file1 file2 Helllo | Hello

6. Вывод имен функций языка C, содержащих измененный код

При использовании утилиты diff для сравнения двух файлов исходного кода на языке C может использоваться специальный параметр (-p), который сообщает утилите о необходимости вывода имен функций, в коде которых были обнаружены изменения. Например, предположим, что требуется сравнить два следующих файла исходного кода на языке C:

Файл с именем file1.c:

#include void compare(float x, float y) { if(x == y) // некорректный способ сравнения { printf("\n РАВНЫ \n"); } } int main(void) { compare(1.234, 1.56789); return 0; }

Файл с именем file2:

#include void compare(float x, float y) { if(x == y) { printf("\n РАВНЫ \n"); } } int main(void) { compare(1.234, 1.56789); return 0; }

Это результат обычного сравнения этих файлов:

$ diff file1.c file2.c 5c5 < if(x == y) // некорректный способ сравнения --- > if(x == y)

А это результат сравнения тех же файлов с использованием параметра -p:

$ diff -p file1.c file2.c *** file1.c 2016-12-29 11:45:36.587010816 +0530 --- file2.c 2016-12-29 11:46:39.823013274 +0530 *************** *** 2,8 **** void compare(float x, float y) { ! if(x == y) // некорректный способ сравнения { printf("\n РАВНЫ \n"); } --- 2,8 ---- void compare(float x, float y) { ! if(x == y) { printf("\n РАВНЫ \n"); }

Очевидно, что в случае использования параметра командной строки -p diff генерирует более подробный вывод с маркировкой измененных строк с помощью символа восклицательного знака ("!").

7. Рекурсивное сравнение содержимого поддиректорий

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

$ diff diff-files/ second-diff-files/ diff diff-files/file1 second-diff-files/file1 1c1 < Hi --- > i diff diff-files/file2 second-diff-files/file2 2c2 < Hello --- > ello

утилита diff будет осуществлять сравнение лишь файлов из директорий верхнего уровня, но в случае использования параметра -r (активирующего режим рекурсивного сравнения файлов) будет осуществляться сравнение даже тех файлов, которые находятся в поддиректориях:

$ diff -r diff-files/ second-diff-files/ diff -r diff-files/file1 second-diff-files/file1 1c1 < Hi --- > i diff -r diff-files/file2 second-diff-files/file2 2c2 < Hello --- > ello diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1 1c1 < Hi --- > i diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2 2c2 < Hello --- > ello

8. Обработка отсутствующих файлов как пустых

Утилита diff также поддерживает параметр, с помощью которого вы можете сообщить ей о том, что следует рассматривать отсутствующие файлы как пустые. Если вы сравните файлы с именами file1 и file3 (причем последнего файла не существует), по умолчанию diff выведет сообщение об ошибке:

$ diff file1 file3 diff: file3: Нет такого файла или каталога

В этом нет ничего плохого; по сути, данное поведение является вполне обоснованным. Но бывают случаи, когда необходимо избежать вывода сообщений об ошибках (возможно, при использовании diff в рамках сценариев командной оболочки), в которых вы можете воспользоваться параметром -N для обработки отсутствующих файлов как пустых и продолжения сравнения файлов.

$ diff -N file1 file3 1,5d0 < Hi < < Helllo < < Bye

Заключение

Если вы внимательно прочитали обе статьи серии и самостоятельно повторили все рассмотренные в них примеры команд, то вполне можно сказать, что вы овладели всеми основными навыками работы с рассматриваемой утилитой. Конечно же, мы не смогли бы обсудить все связанные с diff вопросы в рамках нескольких статей, но все же все основные возможности и функции данной утилиты были так или иначе упомянуты в них.

Если вы хотите узнать немого больше о данной утилите, вы всегда можете обратиться к ее странице руководства . Думаю, не стоит лишний раз упоминать о том, что вы должны периодически использовать утилиту с различными наборами параметров для симуляции различных рабочих ситуаций.

Веб-мастерам или владельцам сайтов часто бывает необходимо сравнить два файла по содержимому. Из этой статьи вы узнаете как сравнить два файла между собой. Здесь описаны все известные мне способы для сравнения текстовых файлов и скрипты (html, css, php и так далее).

Способ 1. Meld

Meld - графический инструмент для получения различий и слияния двух файлов, двух каталогов. Meld - визуальный инструмент сравнения и объединения файлов и каталогов для Linux. Meld ориентирован, в первую очередь, для разработчиков. Однако он может оказаться полезным любому пользователю, нуждающемуся в хорошем инструменте для сравнения файлов и директорий.

В Meld вы можете сравнивать два или три файла, либо два или три каталога. Вы можете просматривать рабочую копию из популярных систем контроля версий, таких, таких как CVS, Subversion, Bazaar-NG и Mercurial. Meld представлен для большинства linux дистрибутивов (Ubuntu, Suse, Fedora и др.), и присутствует в их основных репозиториях.

# aptitude install meld

Способ 2. Сравнение содержимого двух файлов в программе WinMerge.

Бесплатная программа WinMerge позволяет сравнивать не только содержимое файлов, она также сравнивает содержимое целых папок. WinMerge является Open Source инструментом сравнения и слияния для Windows. WinMerge может сравнивать как файлы, так и папки, отображая различия в визуальной текстовой форме, которые легко понять и обработать.

После установки, открываете пункт меню «Файл» - «Открыть». Выбираете файлы для сравнения. Для этого нажимаете на кнопку «Обзор» и выбираете файл. Выбрав файлы, нажимаете на кнопку «ОК».

В WinMerge можно также редактировать файлы. После закрытия окна сравнения, программа предложит сохранить изменения в файлах.

Способ 3. diff

diff - утилита сравнения файлов, выводящая разницу между двумя файлами.

    Для сравнения каталогов используйте эту команду: $ diff -qr < current-directory> < backup-directory>

Способ 4. Kompare

Kompare - отображает различия между файлами. Умеет сравнивать содержимое файлов или каталогов, а также создавать, показывать и применять файлы патчей. Kompare - это графическая утилита для работы с diff, которая позволяет находить отличия в файлах, а также объединять их. Написана на Qt и рассчитана в первую очередь на KDE. Вот ее основные особенности:

    Поддержка нескольких форматов diff;

    Поддержка сравнение файла linux и каталогов;

    Поддержка просмотра файлов diff;

    Настраиваемый интерфейс;

    Создание и применение патчей к файлам.

Способ 5. Сравнение файлов в программе Total Commander

    Поддерживаемые операционные системы: Windows

В Total Commander существует инструмент сравнения файлов по содержимому, где можно не только сравнить содержимое, но и редактировать его и копировать из одного файла в другой.

После запуска Total Commander – в одной из панелей выбираете (клавиша Insert) первый файл для сравнения – во второй панели открываете папку со вторым файлом и ставим на него курсор. Вызываем программу для сравнения: "Файлы→Сравнить по содержимому".

Для внесения изменений в файл достаточно нажать на кнопку «Редактировать». В программе доступны функции копирования и отката, поиска и изменение кодировки. Если вы внесли изменения в файл, то после закрытия окна сравнения, будет предложено сохранить изменения.

Способ 6. Сравнение файлов в Notepad++

    Поддерживаемые операционные системы: Windows, возможен запуск в Linux

Notepad++ не умеет сравнивать файлы. Для появления этого функционала в Notepad++ нужно установить плагин «Compare».

Запускаете редактор – переходите в пункт меню «Плагины» - «Plugin Manager» - «Show Plugin Manager». В новом окне выбираете плагин «Compare» и жмёте кнопку «Install».

После установки плагина откройте два файла и выбирите меню «Плагины» - «Compare» - «Compare (Alt+D)». Результат сравнения файлов будет представлен в отдельных панелях. Напротив строк, в которых найдены отличия будет стоять предупреждающий знак.

Способ 7. Сравнение файлов с помощью командной строки Windows

Сравнение с помощью командной строки Windows (cmd.exe) не позволяет редактировать файлы, но просто сравнить содержимое файлов, используя этот способ, вы можете.

Для вызова командной строки Windows перейдите «Пуск» - «Все программы» - «Стандартные» - «Командная строка» или нажмите клавиш "Windows+R", введите cmd и нажмите клавишу Enter.

В командной строке введите команду:

fc / N путь к первому файлу путь ко второму файлу

Для сравнения двух или нескольких файлов в Linux есть команда diff. Она может сравнивать как отдельные файлы, так и каталоги. Рассмотрим синтаксис, опции команды diff и несколько примеров использования.

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

Diff [опции] файлы-или-директории

Мы указываем опции и подаем на вход два или более файлов или директорий, которые нам нужно сравнить.

Опции команды diff

Рассмотрим основные опции команды diff. Я рассмотрю только те опции, которые сам использую наиболее часто.

-E игнорировать изменения, связанные с добавлением символа табуляции в тексте.
-b игнорировать изменения, связанные с добавлением пробелов.
-w игнорировать изменения, связанные с добавлением пробелов и табуляции.
-B игнорировать новые пустые строки.
-p (или —show-c-function) показать название функции языка C, в которой найдены изменения.
-y (или —side-by-side) отобразить результаты в две колонки.
-r просматривать каталоги рекурсивно.
-X FILE исключить из поиска файлы, имена которых совпадают с шаблонами в файле FILE.
-d (или —minimal) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).

Примеры использования команды diff

Сравнение двух текстовых файлов

Для простого сравнения двух текстовых файлов с именами myfile1 и myfile2 выполним в терминале команду:

Diff myfile1 myfile2

Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):

Diff myfile1 myfile2 > changes.diff

Сравнение директорий, содержащих текстовые файлы

Рассмотрим пример сравнения двух директорий (mydir1 и mydir2), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r, означающую рекурсивный обход файлов в директориях.

Diff -r mydir1 mydir2 > changes.diff

Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:

*.o ChangeLog* *.bak *.exe

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Diff -r -X excludeFiles mydir1 mydir2 > changes.diff

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles, например, vasya.exe или ChangeLog12.

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

Diff -rwBd -X excludeFiles mydir1 mydir2 > changes.diff

Мы сравниваем файлы в директориях mydir1 и mydir2, игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles, чтобы исключить из сравнения ненужные файлы.

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

Man diff

Также существуют программы, которые позволяют сравнивать файлы, используя графический интерфейс. Например, программа Meld , которая в наглядном виде показывает где и что изменилось в файлах.

В операционной системе Linux есть несколько программных решений для сравнения внутреннего содержимого двух файлов различными методами. Безусловно, такая функция будет безумно полезна веб-разработчику для сравнения двух текстовых файлов. К примеру, есть 2 файла стилей css, которые Вам нужно быстро сравнить чтобы найти в них отличия. Или посмотреть, что нового в обновленном PHP скрипте.

Наглядный пример из жизни:

Итак, в моём случае мне нужно сравнить 2 файла bootstrap.css . Летом сего года я что-то исправил в стилях файла bootstrap.css (чего делать нельзя было, т.к. для кастомных правок стилей нужно использовать отдельный style.css). Из-за этой мелочи мне проблематично обновиться с версии 3.3.2 до bootstrap 3.3.5, т.к. в более новой версии свой обнолённый CSS файл, при замене которого все мои правки пропадут и "слетит" часть дизайна веб-сайта. Учитывая, что в файле стилей bootstrap более 6000 строчек кода абсолютно невозможно самостоятельно просмотреть изменения.

Сравниваем файлы с утилитой diff в linux:

Чтобы сравнить файлы `bootstrap.css" и `bootstrap-original.css" (для наглядности переименовал оригинальный файл, дописав к нему приставочку -original), введите в терминале: $ diff bootstrap.css bootstrap-original.css В консоли мы получили стандартный отчет о различиях в этих файлах. Если нужно автоматически сохранить отчет в отдельный файл на диске - направляем вывод результатов diff в файл $ diff bootstrap.css bootstrap-original.css > сss-modifications.diff Теперь весь отчет о различиях файлов сохранится в этот же папке под именем "сss-modifications.diff ". Однако, такой вывод не слишком наглядно показывает где и что было добавлено или убрано мною. Чтобы яснее увидеть чем отличаются два файла, можно использовать sdiff ; Отличие этого пакета в том, что он не генерирует отчёт о различиях. Расположив оба файла в две колонки, он сразу же показывает отличия в обоих файлах. `|" помечает строки, которые различаются между собой `" подсвечивает строки, которые встречаются только во втором файле.

Синтаксис команды аналогичен синтаксису diff:

$ sdiff bootstrap.css bootstrap-original.css Выводим в консоль различия, а командой: $ sdiff bootstrap.css bootstrap-original.css > сss-modifications.diff Записываем весь отчёт в отдельном файле. Я бы еще посоветовал дописать аргумент -t, для более читабельного формата diff отчёта (достигается путем выравнивания расстояний между таблицами пробелами). В противном случае в gedit стандартный отчет откроется отлично, а в Sublime он "расплывётся": $ sdiff bootstrap.css bootstrap-original.css > сss-modifications.diff -t P.S. на этом возможности сравнения файлов в Linux не заканчиваются и можно сравнить даже 3 файла одновременно. Для этого используйте команду Для одновременного сравнения трех файлов используйте diff3. $ diff3 bootstrap.css bootstrap-original.css bootstrap-3.css > new.diff

Сравнение двух файлов в терминале linux (6)

Вот мое решение для этого:

Mkdir temp mkdir results cp /usr/share/dict/american-english ~/temp/american-english-dictionary cp /usr/share/dict/british-english ~/temp/british-english-dictionary cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english

Есть два файла с именем «a.txt» и «b.txt», у которых есть список слов. Теперь я хочу проверить, какие слова добавлены в «a.txt» и не находятся в «b.txt» .

Мне нужен эффективный алгоритм, так как мне нужно сравнить два словаря.

Вы можете использовать инструмент diff в linux для сравнения двух файлов. Для фильтрации требуемых данных вы можете использовать опции --changed-group-format и --unchanged-group-format .

Следующие три варианта могут использовать для выбора соответствующей группы для каждой опции:

    "% <" получить строки из FILE1

    "%>" получает строки из FILE2

    "" (пустая строка) для удаления строк из обоих файлов.

Например: diff --changed-group-format = "% <" --unchanged-group-format = "" file1.txt file2.txt

[ tmp]# cat file1.txt test one test two test three test four test eight [ tmp]# cat file2.txt test one test three test nine [ tmp]# diff --changed-group-format="%<" --unchanged-group-format="" file1.txt file2.txt test two test four test eight

Если вы предпочитаете стиль вывода diff из git diff , вы можете использовать его с флагом --no-index для сравнения файлов не в репозитории git:

Git diff --no-index a.txt b.txt

Используя пару файлов с строками имени файла размером 200 тыс. В каждом, я сравнивал (со встроенной командой time) этот подход и некоторые другие ответы здесь:

Git diff --no-index a.txt b.txt # ~1.2s comm -23 <(sort a.txt) <(sort b.txt) # ~0.2s diff a.txt b.txt # ~2.6s sdiff a.txt b.txt # ~2.7s vimdiff a.txt b.txt # ~3.2s

comm кажется, является самым быстрым на сегодняшний день, тогда как git diff --no-index представляется самым быстрым подходом для вывода в стиле diff.

Обновление 2018-03-25 Фактически вы можете опустить флаг --no-index если вы не находитесь в репозитории git и хотите сравнить невоспроизводимые файлы в этом репозитории. С man-страниц :

Эта форма предназначена для сравнения данных двух путей в файловой системе. Вы можете опустить параметр -no-index при запуске команды в рабочем дереве, контролируемом Git, и по крайней мере одну из точек пути за пределами рабочего дерева или при запуске команды за пределами рабочего дерева, управляемого Git.

Используйте comm -13 (требуется отсортированные файлы) :

$ cat file1 one two three $ cat file2 one two three four $ comm -13 <(sort file1) <(sort file2) four

Сортируйте их и используйте comm:

Comm -23 <(sort a.txt) <(sort b.txt)

comm сравнивает (сортирует) входные файлы и по умолчанию выводит три столбца: строки, которые уникальны для a, строки, которые являются уникальными для b, и строки, которые присутствуют в обоих. Указав -1 , -2 и / или -3 вы можете подавить соответствующий вывод. Поэтому comm -23 ab перечисляет только записи, которые являются уникальными для a. Я использую синтаксис <(...) для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.

если у вас установлен vim, попробуйте следующее:

Vimdiff file1 file2

Vim -d file1 file2

вы найдете его фантастическим.

Поделитесь с друзьями или сохраните для себя:

Загрузка...