Сравнение файлов в Linux
Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В 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:
В результате мы получим строчку: 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. Вот ее основные особенности:
- Поддержка нескольких форматов diff;
- Поддержка сравнение файла linux и каталогов;
- Поддержка просмотра файлов diff;
- Настраиваемый интерфейс;
- Создание и применение патчей к файлам.
2. DiffMerge
DiffMerge — это кроссплатформенная программ для сравнения и объединения файлов. Позволяет сравнивать два или три файла. Поддерживается редактирование строк на лету.
- Поддержка сравнения каталогов;
- Интеграция с просмотрщиком файлов;
- Настраиваемая.
3. Meld
Это легкий инструмент для сравнения и объединения файлов. Он позволяет сравнивать файлы, каталоги, а также выполнять функции системы контроля версий. Программа создана для разработчиков и имеет такие особенности:
- Сравнение двух и трех файлов;
- Использование пользовательских типов и слов;
- Режим автоматического слияния и действия с боками текста;
- Поддержка Git, Mercurial, Subversion, Bazar и многое другое.
4. Diffuse
Diffuse — еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python. Поддерживается две основные возможности — сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра. Основные функции:
- Подсветка синтаксиса;
- Сочетания клавиш для удобной навигации;
- Поддержка неограниченного числа отмен;
- Поддержка Unicode;
- Поддержка Git, CVS, Darcs, Mercurial, RCS, Subversion, SVK и Monotone.
5. XXdiff
XXdiff — это свободный и очень мощный инструмент для сравнения и слияния файлов. Но у программы есть несколько минусов. Это отсутствие поддержки Unicode и редактирования файлов.
- Поверхностное или рекурсивное сравнение одного или двух файлов и каталогов;
- Подсветка отличий;
- Интерактивное объединение;
- Поддержка внешних инструментов сравнения, такие как GNU Diff, SIG Diff, Cleareddiff и многое другое;
- Расширяемость с помощью сценариев;
- Настраиваемость.
6. KDiff3
KDiff3 — еще один отличный, свободный инструмент для сравнения файлов в окружении рабочего стола KDE. Он входит в набор программ KDevelop и работает на всех платформах, включая Windows и MacOS. Можно выполнить сравнение двух файлов linux для двух или трех, или даже сравнить каталоги. Вот основные особенности:
- Отображение различий построчно и посимвольно;
- Поддержка автослияния;
- Обработка конфликтов при слиянии;
- Поддержка Unicode;
- Отображение отличий;
- Поддержка ручного выравнивания.
Выводы
В этой статье мы рассмотрели как выполняется сравнение файлов linux с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!
How do I compare binary files in Linux?
I need to compare two binary files and get the output in the form:
for every different byte. So if file1.bin is
in binary form and file2.bin is
I want to get something like
Is there a way to do this in Linux? I know about cmp -l but it uses a decimal system for offsets and octal for bytes which I would like to avoid.
16 Answers 16
This will print the offset and bytes in hex:
Or do $1-1 to have the first printed offset start at 0.
Unfortunately, strtonum() is specific to GAWK, so for other versions of awk—e.g., mawk—you will need to use an octal-to-decimal conversion function. For example,
Broken out for readability:
diff + xxd
Try diff in the following combination of zsh/bash process substitution:
- -y shows you differences side-by-side (optional).
- xxd is CLI tool to create a hexdump output of the binary file.
- Add -W200 to diff for wider output (of 200 characters per line).
- For colors, use colordiff as shown below.
colordiff + xxd
If you’ve colordiff , it can colorize diff output, e.g.:
Otherwise install via: sudo apt-get install colordiff .
vimdiff + xxd
You can also use vimdiff , e.g.
- if files are too big, add limit (e.g. -l1000 ) for each xxd
There’s a tool called DHEX which may do the job, and there’s another tool called VBinDiff.
For a strictly command-line approach, try jojodiff.
Method that works for byte addition / deletion
Generate a test case with a single removal of byte 64:
If you also want to see the ASCII version of the character:
Tested on Ubuntu 16.04.
I prefer od over xxd because:
- it is POSIX, xxd is not (comes with Vim)
- has the -An to remove the address column without awk .