Сравнение файлов в 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. В выводе утилиты кроме, непосредственно, отображения изменений, выводит строку в которой указывается в какой строчке и что было сделано. Для этого используются такие символы:
К тому же, линии, которые отличаются, будут обозначаться символом .
Вот содержимое наших тестовых файлов:
Теперь давайте выполним сравнение файлов diff:
В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:
Можно сделать вывод в две колонки:
А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:
Чтобы обработать несколько файлов в папке удобно использовать опцию -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 с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Compare files in two different directories in Linux
Use the diff command. Using the -r flag you can compare folders recursively:
The output will be in a format which the patch command understands. You can save it in a file and apply those changes to dir1 using
diff -ur dir1 dir2 > my.patch cd dir1 patch -p1 < ../my.patch
#!/bin/bash diff -ur /tmp/testr/adir1 /tmp/test/adir2 >my.patch cd /tmp/anwar/adir1 patch -p1
I am more interested in seeing those files where mis-match found ( file size or if there count differences as well)
The output from diff can be changed and formatted. You need to go through man diff and play around with those options.
If you deal with text files and want to just see the differences, I would customize the diff output, as hek2mgl suggested. But if you want more control, for example to execute some commands after finding different files or you must compare binary files, you may utilize find and cmp .
Below is the sample, which you may customize:
#!/bin/bash IFS_SAVE="$IFS" IFS=$'\x0a' for f in $(find dir1 -type f -printf "%f\n"); do < f1="dir1/$f" f2="dir2/$f" cmp --quiet "$f1" "$f2" check=$? if [ $check -eq 0 ] ; then echo -e "OK: $f" elif [ $check -eq 1 ] ; then echo -en "Mismatch FOUND in files: " filesize1=$(stat --printf="%s" "$f1" ) filesize2=$(stat --printf="%s" "$f2" ) echo "$f1" size:"$filesize1" "$f2" size:"$filesize2" check:"$check" #you may put diff . or anything else here else echo "cannot compare files, probably $f2 is missing" fi >; done IFS="$IFS_SAVE"
Depending on your situation (if filenames do not contain spaces, there are no missing files, etc.) you may omit some parts - this was just tailored from a larger script.
How to Find Difference Between Two Directories Using Diff and Meld Tools
In an earlier article, we reviewed 9 best file comparison and difference (Diff) tools for Linux and in this article, we will describe how to find the difference between two directories in Linux.
Normally, to compare two files in Linux, we use the diff – a simple and original Unix command-line tool that shows you the difference between two computer files; compares files line by line and it is easy to use, comes with pre-installed on most if not all Linux distributions.
The question is how do we get the difference between two directories in Linux? Here, we want to know what files/subdirectories are common in the two directories, those that are present in one directory but not in the other.
The conventional syntax for running diff is as follows:
$ diff [OPTION]… FILES $ diff options dir1 dir2
By default, its output is ordered alphabetically by file/subdirectory name as shown in the screenshot below. In this command, the -q switch tells diff to report only when files differ.
$ diff -q directory-1/ directory-2/
Again diff doesn’t go into the subdirectories, but we can use the -r switch to read the subdirectories as well like this.
$ diff -qr directory-1/ directory-2/
Using Meld Visual Diff and Merge Tool
There is a cool graphical option called meld (a visual diff and merge tool for the GNOME Desktop) for those who enjoy using the mouse, you can install it as follows.
$ sudo apt install meld [Debian/Ubuntu systems] $ sudo yum install meld [RHEL/CentOS systems] $ sudo dnf install meld [Fedora 22+]
Once you have installed it, search for “meld” in the Ubuntu Dash or Linux Mint Menu, in Activities Overview in Fedora or CentOS desktop and launch it.
You will see the Meld interface below, where you can choose file or directory comparison as well as version control view. Click on directory comparison and move to the next interface.
Select the directories you want to compare, note that you can add a third directory by checking the option “3-way Comparison”.
Once you selected the directories, click on “Compare”.
In this article, we described how to find the difference between two directories in Linux. If you know any other commandline or gui way don’t forget to share your thoughts to this article via the comment section below.