2017-02-07 38 views
0

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

Прямо сейчас, если я использую diff -r -u PATH1 PATH2 тогда я получаю этот вид продукции:

diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt 
--- PATH1/some/subfile.txt  Tue Feb 07 09:16:31 2017 
+++ PATH2/some/subfile.txt  Tue Feb 07 09:16:32 2017 
@@ -70,7 +70,7 @@ 
    * 
    * some stuff 
    * 
- * I am Tweedledee and you are not 
+ * I am Tweedledum and you are not 
    */ 
void twiddle(void) 
{ 
@@ -88,7 +88,7 @@ 
    * check whether we should destroy everything 
    * and then destroy everything in either case 
    */ 
-inline static void Tweedledee(void) 
+inline static void Tweedledum(void) 
{ 
    if (should_destroy_everything()) 
    { 

Я предпочел бы получить только относительные пути ... есть ли способ получить diff сделать это? пример:

diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt 
--- some/subfile.txt 
+++ some/subfile.txt 
@@ -70,7 +70,7 @@ 
    * 
    * some stuff 
    * 
- * I am Tweedledee and you are not 
+ * I am Tweedledum and you are not 
    */ 
void twiddle(void) 
{ 
@@ -88,7 +88,7 @@ 
    * check whether we should destroy everything 
    * and then destroy everything in either case 
    */ 
-inline static void Tweedledee(void) 
+inline static void Tweedledum(void) 
{ 
    if (should_destroy_everything()) 
    { 

Это упростит сравнение отчетов о различиях, которые, как ожидается, будут одинаковыми. (В моем случае PATH1 и PATH2 отличаются в каждом конкретном случае, в то время как относительные пути к файлам, а также точные различия содержания одинаковы)

В противном случае я должен фильтровать эту информацию (либо вручную, либо с помощью сценария)

ответ

1

Я бы вывел вывод вашей команды diff в сценарий sed примерно так: $ diff -r -u PATH1/some/subfile.txt PATH2/some/subfile.txt | sed '1s/PATH1 \ ///' | sed '2s/PATH2 \ ///' Сценарий говорит: «В строке 1 замените« PATH1 », а затем одну косую черту, ничем, а затем в строке 2 замените« PATH2 », а затем сингл

+0

Вы могли бы даже получить новые идеи: SED '1s/^ \\ (--- \\) PATH1 \ // \ 1 /' и sed '2s/^ \\ (+++ \\) PATH2 \/\ 1 /' Эти два утверждения просто говорят только об удалении PATH1 и PATH в начале строки, когда им предшествуют «---» и «+++» соответственно. –

+0

спасибо ... бах, я просто разбирал его в скрипте Python, чтобы делать то, что хотел. –

0

Я удалил пулю и выполнил этот синтаксический разбор на Python, он удаляет операторы diff blah blah blah и релятивизирует пути, но я не тестировал их. к паре указанных корневых каталогов, также удаление временных отметок:

udiff_re = re.compile(r'^@@ -(\d+),(\d+) \+(\d+),(\d+) @@$') 
diffitem_re = re.compile(r'^(\+\+\+|---) (.*)\s+.{7} \d\d \d\d:\d\d:\d\d \d{4}$') 
def process_diff_output(output, dir1, dir2): 
    state = 0 
    lines_pending = [0,0] 
    result = [] 
    for line in output.splitlines(): 
     if state == 0: 
      if line.startswith('@@'): 
       m = udiff_re.search(line) 
       if m: 
        nums = [int(n) for n in m.groups()] 
       else: 
        raise ValueError('Huh?\n' + line) 
       result.append(line) 
       lines_pending = [nums[1],nums[3]] 
       state = 1 
      elif line.startswith('--- ') or line.startswith('+++ '): 
       m = diffitem_re.search(line) 
       whichone = m.group(1) 
       filename = m.group(2) 
       dirx = dir1 if whichone == '---' else dir2 
       result.append('%s %s' % (whichone, os.path.relpath(filename, dirx))) 
      elif line.startswith('diff '): 
       pass # leave the diff cmd out 
      else: 
       raise ValueError('unknown header line\n'+line) 
     elif state == 1: 
      result.append(line) 
      if line.startswith('+'): 
       lines_pending[1] -= 1 
      elif line.startswith('-'): 
       lines_pending[0] -= 1 
      else: 
       lines_pending[0] -= 1 
       lines_pending[1] -= 1 
      if lines_pending == [0,0]: 
       state = 0 
    return '\n'.join(result) 
Смежные вопросы