Bash сравнить два файла

Обновлено: 07.07.2024

Для сравнения двух или нескольких файлов в Linux есть команда 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 выполним в терминале команду:

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

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

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

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

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

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

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

Заключение

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

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

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

В этой статье мы рассмотрим как выполняется сравнение файлов Linux. Разберем самые полезные способы, как для терминала, так и в графическом режиме. Сначала рассмотрим как выполнять сравнение файла linux с помощью утилиты diff.

Сравнение файлов diff

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

$ diff опции файл1 файл2

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

  • -q - выводить только отличия файлов;
  • -s - выводить только совпадающие части;
  • -с - выводить нужное количество строк после совпадений;
  • -u - выводить только нужное количество строк после отличий;
  • -y - выводить в две колонки;
  • -e - вывод в формате ed скрипта;
  • -n - вывод в формате RCS;
  • -a - сравнивать файлы как текстовые, даже если они не текстовые;
  • -t - заменить табуляции на пробелы в выводе;
  • -l - разделить на страницы и добавить поддержку листания;
  • -r - рекурсивное сравнение папок;
  • -i - игнорировать регистр;
  • -E - игнорировать изменения в табуляциях;
  • -Z - не учитывать пробелы в конце строки;
  • -b - не учитывать пробелы;
  • -B - не учитывать пустые строки.

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

К тому же, линии, которые отличаются, будут обозначаться символом <, а те, которые совпадают - символом >.

Вот содержимое наших тестовых файлов:


Теперь давайте выполним сравнение файлов diff:

diff file1 file2


В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:

diff -i file1 file2

Можно сделать вывод в две колонки:

diff -y file1 file2


А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:

diff -u file1 file2


Чтобы обработать несколько файлов в папке удобно использовать опцию -r:


diff -u file1 file2 > file.patch


Как видите, все очень просто. Но не очень удобно. Более приятно использовать графические инструменты.

Сравнение файлов Linux с помощью GUI

Существует несколько отличных инструментов для сравнения файлов в linux в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

1. Kompare


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

2. Meld


Это легкий инструмент для сравнения и объединения файлов. Он позволяет сравнивать файлы, каталоги, а также выполнять функции системы контроля версий. Программа создана для разработчиков и позволяет сравнивать до трёх файлов. Можно сравнивать каталоги и автоматически объединять сравниваемые файлы. Кроме того поддерживаются такие системы контроля версий, как Git.

3. Diffuse


Diffuse - еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python 2. Поэтому в современных версиях Ubuntu программу будет сложно установить. Поддерживается две основные возможности - сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра.

4. KDiff3


KDiff3 - еще один отличный, свободный инструмент для сравнения файлов в окружении рабочего стола KDE. Он входит в набор программ KDevelop и работает на всех платформах, включая Windows и MacOS. Можно выполнить сравнение до трех файлов Linux или даже сравнить каталоги. Кроме того, есть поддержка слияния и ручного выравнивания.

5. TkDiff


Это очень простая утилита для сравнения файлов написанная на основе библиотеки tk. Она позволяет сравнивать только два файла, поддерживает поиск и редактирование сравниваемых файлов.

Выводы

В этой статье мы рассмотрели как выполняется сравнение файлов linux с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!

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

Как использовать команду diff

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

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

Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:

В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff :

Нормальный формат

В простейшей форме, когда команда diff запускается для двух текстовых файлов без каких-либо параметров, она производит вывод в нормальном формате:

Результат будет выглядеть примерно так:

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

  • Номер строки или диапазон строк в первом файле.
  • Особый символ изменения.
  • Номер строки или диапазон строк во втором файле.

Символ изменения может быть одним из следующих:

За командой изменения следуют полные строки, которые удаляются ( < ) и добавляются в файл ( > ).

Формат контекста

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

Параметр -c указывает diff выводить вывод в контекстном формате:

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

Давайте объясним наиболее важные части вывода:

  • В этом примере у нас есть только один раздел, описывающий различия.
  • *** 1,6 **** и --- 1,7 ---- сообщает нам диапазон строк из первого и второго файлов, которые включены в этот раздел.
  • Строки Ubuntu , Debian , Fedora и последняя пустая строка в обоих файлах одинаковы. Эти строки начинаются с двойного пробела.
  • Строка - Arch Linux из первого файла ничего не соответствует во втором файле. Хотя эта строка также существует во втором файле, позиции другие.
  • Строка + Kubuntu из второго файла ничего не соответствует в первом файле.
  • Линия ! CentOS из первого файла и строк ! Arch Linux и ! CentOS из второго файла меняются между файлами.

По умолчанию количество контекстных строк по умолчанию равно трем. Чтобы указать другой номер, используйте параметр -C ( --contexts ):

Единый формат

Используйте параметр -u чтобы указать diff для печати вывода в едином формате:

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

Игнорировать регистр

Как вы могли заметить в приведенных выше примерах, команда diff по умолчанию чувствительна к регистру.

Используйте параметр -i чтобы указать diff игнорировать регистр:

Выводы

Команда diff сравнивает файлы построчно. Для получения дополнительной информации введите в терминале man diff .

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

Посмотрите на команду diff . Это хороший инструмент, и вы можете прочитать все об этом, введя man diff в свой терминал.

Команда, которую вы хотите сделать, это diff File_1.txt File_2.txt , которая выведет разницу между ними и будет выглядеть примерно так:

введите описание изображения здесь>> </p> <p> Быстрая заметка при чтении вывода из третьей команды: «стрелки» (<code>---- +: = 3 =: + ----</code> и <code>---- +: = 4 =: + ----</code>) ссылаются на то, что значение строки находится в левом файле (<code>---- +: = 5 =: + ----</code>) и правый файл (<code>---- +: = 6 =: + ----</code>), причем левым файлом является тот, который вы ввели первым в командной строке, в этом случае <code>---- +: = 7 = + ----</code> </p> <p> Кроме того, вы можете заметить, что 4-я команда - это <code>---- +: = 8 =: + ----</code>, которая передает результаты из <code>---- +: = 9 = : + ----</code> в <code>---- +: = 10 =: + ----</code>, который затем помещает этот вывод в файл, чтобы вы могли его сохранить для более позднего, если вы не хотите просматривать все это на консоли в эту секунду. </p></body></html>

Или вы можете использовать Meld Diff

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

Установите с помощью:

введите описание изображения здесь

введите описание изображения здесь>> </p> <p> Пример с полным текстом: </p> <p> <img src whoanswered

ответил Achu 25 августа 2014, 19:57:51

Вы можете использовать vimdiff .

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

введите описание изображения здесь>> </p></body></html>

Скопируйте сценарий в пустой файл, сохраните его как compare.py , сделайте его исполняемым, запустите его командой:

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

Для печати в файл:

Для печати в окне терминала:

Вы можете использовать команду cmp :

FWIW, мне больше нравится то, что я получаю от бок о бок вывод из diff

даст что-то вроде:

Дополнительный ответ

Если вам не нужно знать, какие части файлов отличаются, вы можете использовать контрольную сумму файла. Существует много способов сделать это, используя md5sum или sha256sum

Рассмотрим сценарий ниже, где вы можете дать два файла в качестве аргументов, и файл скажет вам, являются ли они одинаковыми или нет.

Более старый ответ

Кроме того, существует команда comm , которая сравнивает два отсортированных файла и дает результат в 3-х столбцах: столбец 1 для элементов, уникальных для файл №1, столбец 2 для элементов, уникальных для файла № 2, и столбец 3 для элементов, присутствующих в обоих файлах.

Чтобы подавить любой столбец, вы можете использовать переключатели -1, -2 и -3. Использование -3 показывает линии, которые отличаются.

Ниже вы можете увидеть снимок экрана команды в действии.

введите описание изображения здесь

Существует только одно требование - файлы должны быть отсортированы для их надлежащего сопоставления. sort может использоваться для этой цели. Bellow - это еще один снимок экрана, где файлы сортируются, а затем сравниваются. Строки, начинающиеся с левого звонка только в File_1, строки, начинающиеся с столбца 2, принадлежат только File_2

введите описание изображения здесь>> </p></body></html>

Простым способом является использование colordiff , который ведет себя как diff , но окрашивает его вывод. Это очень полезно для чтения diff. Используя ваш пример,

, где опция u предоставляет унифицированный diff. Вот как выглядит раскрашенный diff:

Читайте также: