Автоматизация различий в каталогах при игнорировании отдельных строк в файлах - PullRequest
1 голос
/ 22 сентября 2011

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

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 Ответ

1 голос
/ 22 сентября 2011

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

С man bash :

-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
...