Como recursivamente lado a lado diff diretórios com números de linha no diff no unix?

1

Meu cenário é realizar diretórios diff lado a lado usando:

diff -ry <folder1> <folder2>

junto com os números de linha na saída do diff . Por padrão, os números de linha não são exibidos na comparação lado a lado e o parâmetro --new-line-format não funciona junto com diff -y apenas funciona com diff -u .

O que tentei fazer [Apenas para arquivos]:

diff -y <(cat -n file1) <(cat -n file2)

para gerar números de linha. O comando acima primeiro gera números de linha e depois passa para o comando diff, então os números das linhas são mantidos intactos no resultado do diff.

Mas quando se trata de usar diff -ry , não consigo alcançar o mesmo. Existe alguma maneira de aplicar cat -n usando algo como xargs [como um pré-processador] no comando diff -ry ?

    
por Ronit Mishra 03.09.2016 / 09:45

2 respostas

1

Você pode converter a saída diff -ru inline em uma apresentação lado a lado, com números de linha e colorir usando o programa python cdiff também conhecido como cdiff.py (não confunda com o cdiff wrapper que faz parte de colordiff ), de Matthew Wang.

Siga qualquer um dos métodos de instalação sugeridos no link, ou apenas extraia o script cdiff.py do download para o seu PATH, então você pode fazer

diff -ru dir1 dir2 | cdiff.py -s
    
por 03.09.2016 / 12:17
1

Stephen Harris deu uma resposta muito boa para a versão anterior desta questão . Infelizmente, não pode lidar com o caso patológico de nomes de arquivos com novas linhas neles. Aqui está uma pequena adaptação de sua resposta que trata desse caso. (Eu também mudei para usar cat -n em vez de nl , e usar a opção -y para diff .)

find folder1 -type f -exec bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash {} +

Como você solicitou uma solução xargs em um comentário sobre a resposta de Stephen, aqui vai você:

find folder1 -type f -print0 | xargs -0 bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash

Observe que esses comandos devem ser feitos em bash , porque o shell POSIX não suporta %código%, e a solução ${parameter/pattern/string} deve ser feita no GNU-land, porque o POSIX não suporta xargs ou find -print0 . (Claro, você poderia substituir xargs -0 por -print0 e descartar o -print , mas você perderia a capacidade de lidar com nomes de arquivos com novas linhas nelas.)

    
por 03.09.2016 / 12:25