Автоматизация diff директории, игнорируя некоторые определенные строки в файлах

Мне нужно сравнить две директории, и произвести какой-то структурированный вывод (текстовый файл в порядке) различий. То есть вывод может выглядеть примерно так:

file1 exists only in directory2
file2 exists only in directory1
file3 is different between directory1 and directory2

Мне плевать на формат, пока информация там есть. Второе требование заключается в том, что мне нужно иметь возможность игнорировать определенные последовательности символов при различении двух файлов. Araxis Merge обладает этой способностью: вы можете ввести Regex и любые файлы, единственное отличие которых состоит в последовательности символов, совпадающей с Regex, и будет сообщаться как идентичная.

Это сделало бы Araxis Merge хорошим кандидатом, НО, пока я не нашел способа создать структурированный вывод diff. Даже при запуске consolecompare.exe с аргументами командной строки, он просто открывает окно графического интерфейса пользователя Araxis, показывающее различия.

Итак, существует ли одно из следующего?

  • Способ заставить Araxis Merge напечатать результат diff в текстовый файл?
  • Еще одна утилита, которая делает diff, игнорируя определенные последовательности символов, и производит структурированный вывод?

Дополнительный кредит, если такая утилита существует как модуль или плагин для Python. Пожалуйста, имейте в виду, что это должно быть сделано полностью из командной строки / скрипта Python - без графического интерфейса.

1 ответ

Решение

В какой-то степени старый добрый diff команда может сделать это, то есть сравнить содержимое каталога и игнорировать изменения, которые соответствуют определенному шаблону регулярных выражений (используя -I опция).

От человека Баш:

-I regexp
      Ignore changes that just insert or delete lines that match  regexp.

Быстрая демонстрация:

[me@home]$ diff images/ images2
Only in images2: x
Only in images/: y
diff images/z images2/z
1c1
< zzz
---
> zzzyy2

[me@home]$ # a less verbose version
[me@home]$ diff -q images/ images2
Only in images2: x
Only in images/: y
Files images/z and images2/z differ

[me@home]$ # ignore diffs on lines that contain "zzz"
[me@home]$ diff -q -I ".*zzz.*" images/ images2/
Only in images2/: x
Only in images/: y
Другие вопросы по тегам