Linux сравнить два каталога рекурсивно

Построчное сравнение текстовых файлов в 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 ), который сообщает утилите о необходимости вывода данных в двух отдельных столбцах. А это пример такого вывода:

Читайте также:  Сколько компьютеров обновилось до windows 10

Очевидно, что при использовании данного формата вывода символ «|» используется для маркировки отличающихся строк.

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) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).
Читайте также:  Google earth для linux mint

Примеры использования команды 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+ и его производные]

Читайте также:  Microsoft windows kernel general код события 12

Так выглядит её интерфейс

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

Источник

Разница между двумя каталогами в 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.

Источник

Оцените статью