Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В 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. В выводе утилиты кроме, непосредственно, отображения изменений, выводит строку в которой указывается в какой строчке и что было сделано. Для этого используются такие символы:
- a - добавлена;
- d - удалена;
- c - изменена.
К тому же, линии, которые отличаются, будут обозначаться символом <, а те, которые совпадают - символом >.
Вот содержимое наших тестовых файлов:
Теперь давайте выполним сравнение файлов diff:
diff file1 file2
В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:
diff -i file1 file2
Можно сделать вывод в две колонки:
diff -y file1 file2
А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:
diff -u file1 file2
Чтобы обработать несколько файлов в папке удобно использовать опцию -r:
diff -r ~/tmp1 ~/tmp2
Для удобства, вы можете перенаправить вывод утилиты сразу в файл:
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 с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!
Хорошая статья. Спасибо.
замечаю что у человека использующего один и тот-же дистр что и я статьи для меня интересней))
Спасибо! Будет с чем сравнить.
Спасибо, интересная статья! Мне для сравнения файлов больше всего подходит vimdiff
Весьма полезный сайт, спасибо автору за труд.
В этой статье, к сожалению, есть грубые ошибки. Неправильно описаны ключи diff.
На самом деле:
-q — сообщить только факт отличия файлов (а не сами отличия файлов)
-s — сообщить факт совпадения файлов (а вовсе не совпадающие части)
-b — не учитывать разницу в количестве пробельных символов (а вовсе не игнорировать пробелы)
А чтобы именно игнорировать пробелы, служит опция:
-w — вообще не учитывать пробельные символы
Пробельные символы — это собственно пробел, символ табуляции и перевод строки (в некоторых случаях).
Здравствуйте. Мне нужно сравнить файлы с 3 виртуальных машин, находящихся по одному адресу /home/user/test. IP адреса необходимо брать из файла /etc/hots.
Не найду информацию, как именно через hosts подключаться
Файл /etc/hosts просто устанавливает соответствие между ip-адресом и именем машины ( или именами, если их несколько ). Подключаться к машинам надо, скорее всего, через ssh.
Всем привет
Нужно сравнить 2 массива, найти файлы, которые есть уже и там, и разобрать их по подпапкам
Адрес 1
/Downloads/Folder1/Folder2/файл1.mkv
/Downloads/Folder1/Folder2/файл2.mkv
Адрес 2
/Serials/Folder1/Folder2/файл1.mkv
Как сделать так, чтобы скрипт сканировал /Downliads, видел, что файл1.mkv в папке /Downloads/Folder1/Folder2/файл1.mkv соответствует названию в /Serials/Folder1/Folder2/файл1.mkv , брал из /Downloads/Folder1/Folder2/файл2.mkv и помещал его рядом с /Serials/Folder1/Folder2/файл1.mkv ?
Иными словами,
Найти в подпапках Downloads файлы, сопоставить с файлами в подпапках Serials. Если найдено 100% совпадение, то из подпапки Downloads, где лежит файл, который совпадает с файлом из подпапки Serials, переместить все файлы из подпапки Downloads в подпапку Serials
find ./Downloads -type f -iname "*.mkv" - получили массив раз
find ./Serials -type f -iname "*.mkv" - получили массив два
а как их сравнить и разобрать?
comm -12 <( sort file1.txt ) <( sort file2.txt )