Автоматизация 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