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

Сравнение файлов в 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:

diff file1 file2

В результате мы получим строчку: 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 в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

Читайте также:  Apx драйвер для windows 10

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 с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!

Источник

Команда Diff в Linux

diff — это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.

Команда diff обычно используется для создания патча, содержащего различия между одним или несколькими файлами, которые можно применить с помощью команды patch .

Как использовать команду diff

Синтаксис команды diff следующий:

Команда diff может отображать вывод в нескольких форматах, наиболее распространенными из которых являются обычный, контекстный и унифицированный формат. Вывод включает информацию о том, какие строки в файлах необходимо изменить, чтобы они стали идентичными. Если файлы совпадают, вывод не производится.

Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:

В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff :

Нормальный формат

В простейшей форме, когда команда diff запускается для двух текстовых файлов без каких-либо параметров, она производит вывод в нормальном формате:

Результат будет выглядеть примерно так:

Обычный выходной формат состоит из одного или нескольких разделов, в которых описываются различия. Каждый раздел выглядит так:

0a1 , 2d2 и 4c4,5 — это команды изменения. Каждая команда изменения содержит следующее слева направо:

  • Номер строки или диапазон строк в первом файле.
  • Особый символ изменения.
  • Номер строки или диапазон строк во втором файле.
Читайте также:  Windows 10 one language key

Символ изменения может быть одним из следующих:

  • a — Добавьте линии.
  • c — Измените линии.
  • d — Удалить строки.

За командой изменения следуют полные строки, которые удаляются ( ) и добавляются в файл ( > ).

  • 0a1 — добавить строку 1 второго файла в начало file1 (после строки 0 ).
    • > Kubuntu — Строка из второй строки, которая добавляется в первый файл, как описано выше.
  • 2d2 — Удалить строку 2 в первом файле. 2 после символа d означает, что если строку не удалить, она появится на строке 2 второго файла.
    • — удаленная строка.
  • 4c4,5 — Заменить (изменить) строку 5 в первом файле на строки 4-5 из второго файла.
    • — строка в первом заменяемом файле.
    • — — Разделитель.
    • > Arch Linux и > Centos — Строки из второго файла, заменяющие строку в первом файле.

Формат контекста

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

Параметр -c указывает diff выводить вывод в контекстном формате:

Вывод начинается с имен и меток времени сравниваемых файлов, а также с одного или нескольких разделов, описывающих различия. Каждый раздел выглядит так:

  • from-file-line-numbers и to-file-line-numbers — Номера строк или разделенный запятыми диапазон строк в первом и втором файле, соответственно.
  • from-file-line и to-file-line — Строки, которые различаются, и строки контекста:
    • Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
    • Строки, начинающиеся со знака минуса ( — ), — это строки, которые ничего не соответствуют во втором файле. Во втором файле отсутствуют строки.
    • Строки, начинающиеся с символа плюса ( + ), — это строки, которые ничего не соответствуют в первом файле. В первом файле отсутствуют строки.
    • Строки, начинающиеся с восклицательного знака ( ! ), — это строки, которые меняются между двумя файлами. Каждая группа строк, начинающаяся с ! из первого файла имеет соответствующее совпадение во втором файле.

Давайте объясним наиболее важные части вывода:

  • В этом примере у нас есть только один раздел, описывающий различия.
  • *** 1,6 **** и — 1,7 —- сообщает нам диапазон строк из первого и второго файлов, которые включены в этот раздел.
  • Строки Ubuntu , Debian , Fedora и последняя пустая строка в обоих файлах одинаковы. Эти строки начинаются с двойного пробела.
  • Строка — Arch Linux из первого файла ничего не соответствует во втором файле. Хотя эта строка также существует во втором файле, позиции другие.
  • Строка + Kubuntu из второго файла ничего не соответствует в первом файле.
  • Линия ! CentOS из первого файла и строк ! Arch Linux и ! CentOS из второго файла меняются между файлами.

По умолчанию количество контекстных строк по умолчанию равно трем. Чтобы указать другой номер, используйте параметр -C ( —contexts ):

Единый формат

Унифицированный выходной формат — это улучшенная версия контекстного формата, обеспечивающая меньший размер вывода.

Используйте параметр -u чтобы указать diff для печати вывода в едином формате:

Вывод начинается с имен и отметок времени файлов и одного или нескольких разделов, описывающих различия. Каждый раздел имеет следующую форму:

  • @@ from-file-line-numbers to-file-line-numbers @@ — Номер строки или диапазон строк из первого и второго файлов, включенных в этот раздел.
  • line-from-files — строки, которые отличаются и строки контекста:
    • Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
    • Строки, начинающиеся с символа минуса ( — ), — это строки, которые удаляются из первого файла.
    • Строки, начинающиеся с символа плюса ( + ), — это строки, добавленные из первого файла.
Читайте также:  Как убрать активацию windows 10 с экрана 2020

Игнорировать регистр

Как вы могли заметить в приведенных выше примерах, команда diff по умолчанию чувствительна к регистру.

Используйте параметр -i чтобы указать diff игнорировать регистр:

Выводы

Сравнение текстовых файлов на предмет различий — одна из самых распространенных задач системных администраторов Linux.

Команда diff сравнивает файлы построчно. Для получения дополнительной информации введите в терминале man diff .

Если у вас есть вопросы, оставьте комментарий ниже.

Источник

В linux, как сравнить два каталога только по имени файла и получить список результатов, которые не совпадают

Я хотел бы знать, как сравнить два каталога (не рекурсивно) только по имени файла (игнорировать расширение), чтобы увидеть разницу. Например, если у меня есть список A и B, я хочу знать, что присутствует в A, а не в B.

В настоящее время я обрабатываю некоторые изображения. В одном каталоге у меня есть исходные файлы с расширением .tiff, а в другом — обработанные файлы с расширением .png. Имена файлов в обоих каталогах совпадают, но отличается только расширение (например, один файл называется foo.tiff в каталоге A, и он называется foo.png в каталоге B).

Пытаюсь найти, какие файлы еще не обрабатывались.

4 ответа

Если я вас правильно понял, вам понадобится следующий скрипт:

Он показывает файлы, присутствующие в первой папке, но отсутствующие во второй. как это:

Использование команды diff может сделать это за вас.

Надеюсь это поможет.

-q Сообщать только о различиях файлов, но не подробности различий.
-r При сравнении каталогов рекурсивно сравнивать все найденные подкаталоги.

Сначала создадим вспомогательную функцию:

Если вы запустите getfiles dirname , он вернет отсортированный список файлов в этом каталоге без имени каталога и без какого-либо расширения. Параметр -maxdepth 1 означает, что find не будет выполнять рекурсивный поиск.

Теперь сравним каталоги файлов A и B :

Вывод в обычном формате diff . Поскольку можно использовать любые стандартные параметры diff, выходной формат достаточно гибкий.

Примере

Вот примерный каталог A и B , в каждом из которых есть один файл, которого нет в другом:

Выходные данные правильно идентифицируют (а) что B имеет файл baz , которого нет в A и (б) что A имеет файл qux , который отсутствует в B .

Альтернативный выход

Предположим, что мы просто хотим провести одностороннее сравнение и выяснить, какие файлы в B также отсутствуют в A . В этом случае можно использовать grep :

Здесь используются следующие параметры:

-v указывает grep исключить совпадающие строки

-x указывает grep соответствовать только целым строкам

-F сообщает grep , что шаблоны являются фиксированными строками, а не регулярными выражениями.

  • -f указывает grep получить список шаблонов из файла или, в данном случае, файлового объекта .
  • Пример с именами файлов и каталогов, которые включают пробелы

    Рассмотрим эти файлы:

    Ограничение

    Если в каком-либо из ваших имен файлов есть символы новой строки, это даст неверные результаты. По крайней мере, для формы grep это можно было бы распространить на более общий случай.

    Источник

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