Для сравнения каталогов linux

Для сравнения каталогов linux

Библиотека сайта rus-linux.net

4. Сравнение каталогов

Возможно использование ‘diff’ для сравнения некоторых или всех файлов в двух каталогах. Когда оба аргумента-имена файлов для ‘diff’ ­ каталоги, он сравнивает каждый файл, содержащийся в обоих каталогах, в алфавитном порядке имен файлов. Обычно ‘diff’ не упоминает о парах неотличающихся файлов, но с опцией ‘-s’ или ‘—report-identical-files’, он будет сообщать и о таких парах. Обычно ‘diff’ сообщает о подкаталогах, общих для обоих каталогов, не сравнивая файлы в них, но с помощью опции ‘-r’ или ‘—recursive’, он бужет сравнивать соответствующие файлы в дереве каталогов, опускаясь до самых глубоких каталогов.

Для имен файлов, содержащихся только в одном каталоге, ‘diff’ обычно не показывает текста этих файлов, сообщая только, что файлы находятся в одном каталоге и отсутствуют в другом. Можно заставить ‘diff’ поступать так, как если бы соответствующие файлы существовали и в другом каталоге, но являлись пустыми, тогда в результатах будет присутствовать полный текст таких файлов. (Такие отличия будут рассматриваться как вставки или удаления, в зависимости от того существует файл в первой или второй директории.) Чтобы добиться этого используйте опцию ‘-N’ или ‘—new-file’.

Если в более старом каталоге содержится один или более больших файлов, не содержащихся в более новом, можно уменьшить patch с помощью опции ‘-P’ или ‘—unidirectional-new-file’ вместо ‘-N’. Эта опция подобна ‘-N’, за исключением того, что она вставляет только содержимое файлов, появившихся во втором каталоге, а не в первом (т.е. добавленных файлов). В начале patch пишется инструкция для пользователей, применяющих patch, — стереть удаленные файлы, перед применением (см. подробнее о составлении patch-ей: «Составление patch-ей»).

Для игнорирования некоторых файлов при сравнении каталогов, используйте опцию ‘-x PATTERN’ или ‘—exclude=PATTERN’. Эта опция игнорирует все файлы или поддиректории, чьи базовые имена соответствуют шаблону оболочки PATTERN. В отличие от оболочки, точка в начале имени файла рассматривается так же, как символ *. Следует заключать PATTERN в апострофы, чтобы оболочка не истоловала их неправильно. Например, опция ‘-x ‘*.[ao]» игнорирует все файлы, имена которых заканчиваются на ‘.a’ или ‘.o’.

Информация, указанная в этой опции, сохраняется, если ее использовать несколько раз. Например, использование опций ‘-x ‘RCS’ -x ‘*,v» задает игнорирование всех файлов и подкаталогов, имеющих имя ‘RCS’ или заканчивающихся на ‘,v’.

Если необходимо использовать эту опцию по несколько раз, можно вместо этого поместить шаблоны в файл, по одному на строку и использовать опцию ‘-X FILE’ или ‘—exclude-from=FILE’.

Если два каталога находились в процессе сравнения и этот процесс был прерван, позже возможно вернуться к сравнению и продолжить его с того же места с помощью опции ‘-S FILE’ или ‘—starting-file=FILE’. После этого сравниваться будут только файл и FILE и следующеи за ним в алфавитном порядке, в верхнем уровне директории.

Источник

Linux: сравнение структуры каталогов без сравнения файлов

Каков наилучший и самый простой способ сравнить две структуры каталогов, фактически не сравнивая данные в файлах? Это отлично работает:

Но он очень медленный, потому что он также сравнивает файлы. Есть ли переключатель для diff или другой простой инструмент cli для этого?

Читайте также:  Mac os monterey opencore

8 ответов

Следующее (если вы замените первый каталог для каталога1 и второй для directory2) должно делать то, что вы ищете и быстро:

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

Это может упасть (произвести wierd output), если у вас есть возврат каретки в некоторых именах каталогов, но не в других.

Я обычно использую rsync для этой задачи:

ОЧЕНЬ ОСТОРОЖНО , чтобы всегда использовать -n , aka —dry-run , или он будет синхронизировать (изменять содержимое) каталогов.

Это будет сравнивать файлы, основанные на временах и размерах модификации файлов . I think это то, что вы действительно хотите, или, по крайней мере, вы не против, если это так? Я понял, что вы просто хотите, чтобы это случилось быстрее , а не то, что вам нужно, чтобы игнорировать разницу между содержимым файла. Если вы хотите, чтобы он не отображал разные файлы с одинаковыми именами, я думаю, что добавление опции —ignore-existing сделает это.

Также имейте в виду, что не положить / в конце DIR1 приведет к тому, что он сравнивает каталог DIR1 с содержимым из DIR2 .

Результат заканчивается бит многословным, но он покажет вам, какие файлы /каталоги отличаются. Файлы /каталоги присутствуют в DIR2 , а не в DIR1 будет предваряться словом deleting .

В некоторых ситуациях ответ @ slartibartfast может быть более уместным, хотя вам нужно удалить параметр -type d , чтобы включить список файлов без каталога. rsync будет быстрее, если у вас есть значительное количество файлов /каталогов для сравнения.

Как и в ответе ls, но если вы установите дерево , вы можете

Источник

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

Читайте также:  Linux список ip адресов

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles , например, vasya.exe или ChangeLog12 .

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

Мы сравниваем файлы в директориях mydir1 и mydir2 , игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles , чтобы исключить из сравнения ненужные файлы.

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

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

Источник

В 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 это можно было бы распространить на более общий случай.

    Источник

    Как сравнить различия между каталогами (Linux)

    У меня есть две директории — одна из более ранней резервной копии и вторая из новейшей резервной копии. Как сравнить, какие изменения были внесены в файлы в каталоге из новейшей резервной копии в Linux? Также, как мне отобразить изменения, например, в текстовых и php файлах — я думаю о чем-то вроде истории изменений в Википедии, где вы видите старую версию на одной стороне экрана и самую новую версию на другой, и изменения подсвечиваются. Как мне достичь чего-то подобного?

    Читайте также:  Драйвера для диска linux

    Редактировать: Как я могу также сравнить удаленный каталог с локальным?

    Из справочной страницы diff:

    Если оба файла from-file и to-file являются каталогами, diff сравнивает соответствующие файлы в обоих каталогах в алфавитном порядке; это сравнение не является рекурсивным, если не задана опция -r или —recursive. diff никогда не сравнивает фактическое содержимое каталога, как если бы это был файл. Файл, который полностью указан, может не быть стандартным вводом, потому что стандартный ввод является безымянным и понятие «файл с тем же именем» не применяется.

    Итак, для сравнения каталогов: diff —brief -r dir1 dir2

    Чтобы сравнить файлы рядом: diff —side-by-side file1 file2

    • мы находимся www1 , сравнивая с удаленным www2
    • есть аутентификация с открытым ключом от локального www1 к удаленному www2
    • мы сравниваем как одного и того же пользователя на локальном www1 и удаленном www2

    Вы действительно хотите объединить мощность, rsync чтобы уменьшить потребление полосы пропускания с мощностью, diff чтобы дать вам гибкие, ну и отличия.

    Так что-то вроде этого:

    Я думаю, вы могли бы немного подправить это, если бы вы делали это часто, rsync а не cp в первой строке — очевидно, в последней строке у вас есть все возможности diff для форматирования, как вам нравится. Вероятно, с у в случае ОП

    Недостатком этого подхода является то, что вы в конечном итоге используете вдвое больше локального пространства, но при этом менее чем на 1 долл. / Гиг, кого это волнует?

    Делайте diff old_dir new_dir > diff.txt для параллельных различий на одном сервере.

    Для удаленных файлов:

    Например: ABC — это существующий сервер, а XYZ — ваш удаленный сервер, а имя каталога — 123.

    Шаг 1: Переименуйте существующий каталог 123 на ABC Server как 123_ABC.

    Шаг 2: Создайте новый каталог на сервере ABC:

    Шаг 3: Скопируйте все файлы из каталога 123 на сервере XYZ в каталог 123_XYZ на сервере ABC:

    Это скопирует все файлы из каталога на вашем XYZ-сервере в каталог ABC server / 123_XYZ.

    Шаг: 4: Сделайте различие между обоими каталогами:

    Теперь перейдите на сервер ABC и выполните различие между 123_ABC и 123_XYZ.

    Команда выше сохранит результаты diff в diff.txt по тому же пути.

    Вы можете сравнить различия тогда.

    AIDE Advanced Intrusion Detection Environment (AIDE) является проверка целостности файлов для операционных систем UNIX. Его целью является предоставление отчетов о целостности данных в поддерживаемых файловых системах. Несколько раз запустив AIDE на целевом хосте, вы можете определить, какие файлы меняются. Запустив AIDE несколько раз на разных хостах, вы можете определить, какие файлы и разрешения отличаются. Затем используйте инструмент gui diff для указанных «разных» файлов.

    Или используйте инструмент gui diff, такой как meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff или xxdiff. Большинство из них будет делать различия в каталогах в дополнение к различиям в файлах. Вам нужно будет смонтировать удаленный диск, используя NFS, SMBFS или SSHFS, как уже упоминали другие.

    Или вы можете использовать два файла с выходом списка файлов. А затем сравните эти два файла. Например:

    Загрузите один из файлов.

    Используйте diff ( diff -y remote-files local-files > diff-files ), чтобы сравнить их рядом. Откройте diff-файлы и проверьте его. Каждая строка с> означает другой файл.

    Источник

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