- Построчное сравнение текстовых файлов в Linux с помощью утилиты diff — часть 2
- Параметры командной строки утилиты diff
- 1. Вывод сообщения об идентичности файлов
- 2. Копируемый и унифицированный контексты вывода
- 3. Вывод сценария для текстового редактора ed
- 4. Генерация вывода в двух столбцах
- 5. Сокрытие идентичных строк
- 6. Вывод имен функций языка C, содержащих измененный код
- 7. Рекурсивное сравнение содержимого поддиректорий
- 8. Обработка отсутствующих файлов как пустых
- Заключение
- Сравнение файлов в Linux (команда diff)
- Синтаксис команды diff
- Опции команды diff
- Примеры использования команды diff
- Сравнение двух текстовых файлов
- Сравнение директорий, содержащих текстовые файлы
- Заключение
- Чем сравнить две директории в Linux? С помощью Diff и Meld Tools
- Разница между двумя каталогами в Linux
- 15 ответов
Построчное сравнение текстовых файлов в Linux с помощью утилиты diff — часть 2
Оригинал: How to do line-by-line comparison of files in Linux using diff command — Part II
Автор: Himanshu Arora
Дата публикации: 2 января 2017 г.
Перевод: А.Панин
Дата перевода: 13 февраля 2017 г.
В первой статье серии мы обсудили основные вопросы, связанные с использованием утилиты diff, включая принцип ее работы, а также методику разбора ее вывода. Хотя данная утилита с интерфейсом командной строки и предполагает высокий уровень вхождения, вам стоит научиться работать с ней, особенно в том случае, если ваша повседневная работа связана с обработкой файлов на машинах, работающих под управлением Linux без графического интерфейса.
Предполагая, что вы уже умеете работать с утилитой diff, в данной статье я предлагаю обсудить различные параметры командной строки этой утилиты на основе простых для понимания примеров.
Но перед тем, как перейти к рассмотрению параметров командной строки утилиты, следует упомянуть о том, что все примеры из данной статьи были протестированы в системе Ubuntu 14.04 с Bash версии 4.3.11(1) и diff версии 3.3.
Параметры командной строки утилиты diff
1. Вывод сообщения об идентичности файлов
По умолчанию в случае установления факта идентичности файлов утилита diff не выводит никаких сообщений.
Но существует специальный параметр командной строки ( -s ), в случае использования которого данная утилита будет сообщать об идентичности файлов:
2. Копируемый и унифицированный контексты вывода
Утилита diff поддерживает, по сути, два различных формата вывода. Копируемый контекст вывода (copied context) активируется с помощью параметра командной строки -c , а унифицированный контекст (unified context) — с помощью параметра командной строки -u . Это пример первого первого формата вывода:
Очевидно, что в случае использования копируемого контекста вывода отличающиеся строки маркируются с помощью символа восклицательного знака ( «!» ).
А это пример унифицированного контекста вывода:
В случае использования этого формата вывода символы «+» и «-» перед строками соответствуют различиям в файлах: с помощью символа «-» маркируются строки из файла с именем file1, отсутствующие в файле с именем file2, а с помощью символа «+» — строки из файла с именем file2, которые должны быть добавлены в файл с именем file1.
3. Вывод сценария для текстового редактора ed
Утилита diff также может выводить последовательности команд, которые, в свою очередь, могут использоваться текстовым редактором ed для преобразования оригинального файла (в наших примерах с именем file1) в новый файл (с именем file2). Вы можете получить такой вывод следующим образом.
Предположим, что файлы с именами file1 и file2 имеют следующие различия:
Теперь используем параметр командной строки -e для генерации вывода, понятного текстовому редактору ed , после чего перенаправим этот вывод в отдельный файл:
В данном случае в файле будет сохранен следующий вывод утилиты:
После этого вам придется самостоятельно добавить команду «w» в конец этого файла:
Теперь вы можете выполнить следующую команду:
В результате файлы с именами file1 и file2 станут идентичными:
Если вас интересует дополнительная информация, связанная с данной функцией утилиты, вы можете перейти по этой ссылке .
4. Генерация вывода в двух столбцах
Обычно diff генерирует вывод следующего формата:
Но существует специальный параметр командной строки ( -y ), который сообщает утилите о необходимости вывода данных в двух отдельных столбцах. А это пример такого вывода:
Очевидно, что при использовании данного формата вывода символ «|» используется для маркировки отличающихся строк.
5. Сокрытие идентичных строк
Если вы внимательно рассмотрите вывод из предыдущего примера (из расположенного выше раздела 4), вы обнаружите, что при использовании параметра командной строки -y утилита diff выводит не только измененные, но и идентичные строки обрабатываемых файлов. В том случае, если вам нужно убрать идентичные строки из вывода, вы можете воспользоваться параметром —suppress-common-lines .
6. Вывод имен функций языка C, содержащих измененный код
При использовании утилиты diff для сравнения двух файлов исходного кода на языке C может использоваться специальный параметр ( -p ), который сообщает утилите о необходимости вывода имен функций, в коде которых были обнаружены изменения. Например, предположим, что требуется сравнить два следующих файла исходного кода на языке C:
Файл с именем file1.c:
Файл с именем file2:
Это результат обычного сравнения этих файлов:
А это результат сравнения тех же файлов с использованием параметра -p :
Очевидно, что в случае использования параметра командной строки -p diff генерирует более подробный вывод с маркировкой измененных строк с помощью символа восклицательного знака ( «!» ).
7. Рекурсивное сравнение содержимого поддиректорий
Утилита diff также позволяет осуществлять рекурсивное сравнение содержимого поддиректорий, но этот режим работы не активирован по умолчанию. Я подразумевал, что при использовании данной команды:
утилита diff будет осуществлять сравнение лишь файлов из директорий верхнего уровня, но в случае использования параметра -r (активирующего режим рекурсивного сравнения файлов) будет осуществляться сравнение даже тех файлов, которые находятся в поддиректориях:
8. Обработка отсутствующих файлов как пустых
Утилита diff также поддерживает параметр, с помощью которого вы можете сообщить ей о том, что следует рассматривать отсутствующие файлы как пустые. Если вы сравните файлы с именами file1 и file3 (причем последнего файла не существует), по умолчанию diff выведет сообщение об ошибке:
В этом нет ничего плохого; по сути, данное поведение является вполне обоснованным. Но бывают случаи, когда необходимо избежать вывода сообщений об ошибках (возможно, при использовании diff в рамках сценариев командной оболочки), в которых вы можете воспользоваться параметром -N для обработки отсутствующих файлов как пустых и продолжения сравнения файлов.
Заключение
Если вы внимательно прочитали обе статьи серии и самостоятельно повторили все рассмотренные в них примеры команд, то вполне можно сказать, что вы овладели всеми основными навыками работы с рассматриваемой утилитой. Конечно же, мы не смогли бы обсудить все связанные с diff вопросы в рамках нескольких статей, но все же все основные возможности и функции данной утилиты были так или иначе упомянуты в них.
Если вы хотите узнать немого больше о данной утилите, вы всегда можете обратиться к ее странице руководства . Думаю, не стоит лишний раз упоминать о том, что вы должны периодически использовать утилиту с различными наборами параметров для симуляции различных рабочих ситуаций.
Источник
Сравнение файлов в Linux (команда diff)
Для сравнения двух или нескольких файлов в 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 выполним в терминале команду:
Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):
Сравнение директорий, содержащих текстовые файлы
Рассмотрим пример сравнения двух директорий ( mydir1 и mydir2 ), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r , означающую рекурсивный обход файлов в директориях.
Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:
Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:
Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles , например, vasya.exe или ChangeLog12 .
Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:
Мы сравниваем файлы в директориях mydir1 и mydir2 , игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles , чтобы исключить из сравнения ненужные файлы.
Заключение
Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:
Также существуют программы, которые позволяют сравнивать файлы, используя графический интерфейс. Например, программа Meld, которая в наглядном виде показывает где и что изменилось в файлах.
Источник
Чем сравнить две директории в Linux? С помощью Diff и Meld Tools
Для тех пользователей линукс мира, у кого как и у меня, время от времени возникает необходимость сравнения файлов и директорий, решил написать эту небольшую статью, о двух прекрасных, на мой взгляд, утилитах — утилита командной строки diff и утилита с графическим Meld Tools. Опережая реакцию неосиляторов и не желающих разбираться самостоятельно, ответственно заявляю, эта статья лишь ознакомительная, и не претендует на роль мануала, посему не буду подробно расписывать как сравнивать файлы и директории в Diff и Meld, тем более они имеют, на мой взгляд, интуитивно понятный интерфейс, разобраться в котором сможет даже бабушка, ну или дедушка. К слову сказать, в настоящее время у меня есть очень явный пример того, что линукс в целом и информационные технологии, в частности, всем возрастам покорны. В Manjaro группе в телеграмме, есть у нас товарищ, ему 61 год, с компьютером он познакомился в 55 лет, ныне пенсионер и всю жизнь проработал шахтёром. Так вот от него вопросов по настройке и помощи в линуксе слышно меньше, чем от 20-25 летних юнцов.
Что-то я ушёл от темы. Итак, обычно для того, чтобы сравнить два файла в Linux, я использую
. Если честно пользуюсь ей я ни потому, что я прям вот обожаю до ужаса этот волшебный мир консоли хотя да, он великолепен, а потому что diff есть «из коробки»в большинстве, если во всех дистрибутивах Linux, и если возникает необходимость сравнения файлов на чужом компьютере, то легче всего открыть терминал и использовать diff.
Так вот для сравнения двух каталогов достаточно выполнить простейшую команду:
diff -q directory-1/ directory-2/
Так это выглядит у меня Если вам необходимо сравнить рекурсивно, со сравнением поддиректорий, то используйте ключ -r.
Вторая утилита о которой хочу рассказать, это графическая утилита которая позиционируется, как инструмент визуального сравнения и слияния для рабочего стола GNOME, но конечно же, не будет преступлением использовать её и с другими окружениями рабочего стола. Устанавливается она простым вводом одной команды:
sudo pacman -S meld [Archlinux и его производные]
sudo apt install meld [Debian/Ubuntu и его производные]
sudo yum install meld [RHEL/CentOS и его производные]
sudo dnf install meld [Fedora 22+ и его производные]
Так выглядит её интерфейс
Как я написал выше, разберется в нём и стар и млад, учиться никогда не поздно. Благо в линуксе каждый найдёт для себя то, что ему нравится, кто-то фанатеет от консольки и работает только в ней, кто-то любит графические интерфейсы. Если у кого то возникнут вопросы, не стесняйтесь спрашивайте в комментариях всегда открыт к диалогу.
Источник
Разница между двумя каталогами в Linux
Я пытаюсь найти файлы, существующие в одном каталоге, но не в другом, я попытался использовать эту команду:
Проблема с приведенной выше командой заключается в том, что она находит файлы dir1 , но не в dir2 , а также файлы в dir2 , но не в dir1 ,
Я пытаюсь найти файлы в dir1 , но не только в dir2 .
Вот небольшой пример того, что мои данные выглядят как
Еще один вопрос, как я могу найти файлы в dir1 , но не в dir2 или dir3 в одной команде?
15 ответов
Объяснение:
diff -r dir1 dir2 показывает, какие файлы находятся только в каталоге dir1 и только в dir2, а также изменения файлов, присутствующих в обоих каталогах, если они есть.
diff -r dir1 dir2 | grep dir1 показывает, какие файлы находятся только в dir1
awk для печати только имени файла.
Это должно сделать работу:
Опции объяснены (с помощью справочной страницы diff (1)):
- -r — Рекурсивно сравнить все найденные подкаталоги.
- -q — -q только файлы различаются.
Эта команда даст вам файлы, которые находятся в каталоге dir1, а не в каталоге dir2.
О знаке , вы можете использовать его как «подстановка процесса».
Хорошим способом сделать это сравнение является использование find с md5sum , затем diff .
Используйте find , чтобы перечислить все файлы в каталоге, а затем вычислить хеш md5 для каждого файла и передать его в файл:
Сделайте ту же процедуру в другом каталоге:
Затем сравните результат с двумя файлами с «diff»:
Эта стратегия очень полезна, когда два сопоставимых каталога не находятся на одном компьютере, и вам нужно убедиться, что файлы одинаковы в обоих каталогах.
Другим хорошим способом выполнения задания является использование git
Meld (http://meldmerge.org/) отлично справляется с сопоставлением каталогов и файлов внутри.
vim Плагин DirDiff — еще один очень полезный инструмент для сравнения каталогов.
Он не только перечисляет, какие файлы отличаются между каталогами, но также позволяет вам проверять/изменять с помощью vimdiff файлы, которые отличаются друг от друга.
Не удовлетворенный всеми ответами, поскольку большинство из них работают очень медленно и производят излишне длинный вывод для больших каталогов, я написал собственный скрипт Python для сравнения двух папок.
В отличие от многих других решений, он не сравнивает содержимое файлов. Также он не входит в подкаталоги, отсутствующие в другом каталоге. Таким образом, вывод довольно краткий, и скрипт работает быстро.
Или если вы хотите видеть только файлы из первого каталога:
PS Если вам нужно сравнить размеры файлов и хэши файлов для потенциальных изменений, я опубликовал обновленный сценарий здесь: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
Другой (возможно, более быстрый для больших каталогов) подход:
Команда sed удаляет первый компонент каталога благодаря сообщению Эрика)
В принятом ответе также будут перечислены файлы, которые существуют в обоих каталогах, но имеют различный контент. Чтобы перечислить ТОЛЬКО файлы, которые существуют в каталоге dir1, вы можете использовать:
- diff -r dir1 dir2: сравнить
- grep ‘Только в’: получите строки, содержащие ‘Only in’
- grep dir1: получить строки, содержащие dir
Это немного поздно, но может помочь кому-то. Не уверен, что diff или rsync выдают только имена файлов в таком формате. Спасибо пнну за то, что я дал это прекрасное решение, которое я расширил ниже.
Если вам нужны только имена файлов, поэтому просто скопировать нужные файлы в чистом формате, вы можете использовать команду find.
Это предполагает, что оба dir1 и dir2 находятся в одной родительской папке. sed просто удаляет родительскую папку, чтобы вы могли сравнивать яблоки с яблоками. Последний sed просто возвращает имя dir1.
Источник