diff dois diretórios para mudanças e saída de formato a ser usada para script

3

Atualmente, tento monitorar dois diretórios e subdiretórios para alterações nos arquivos. Os diretórios contêm o mesmo conjunto de arquivos, alguns deles são alterados. Então, pensei em usar o comando diff para criar uma lista de arquivos alterados com os números de linha e as alterações. Eu preciso dessa lista para processá-la ainda por outro script.

Como você pode usar a opção diff -r para verificar recursivamente as alterações, tentei formatar a saída para atender às minhas necessidades. Não consigo usar a saída de múltiplas linhas padrão, mas quero ter o seguinte:

file_1 :

my first line
my second line
my third line

file_2 :

my first line
my changed second line
my third line

Meu resultado desejado seria semelhante a:

file_2:2:my changed second line

ou (se for mais fácil):

file_1:2:my second line
file_2:2:my changed second line

Consegui produzir a saída sem o nome do arquivo com os seguintes parâmetros:

diff -qbBwr --unchanged-line-format="" --old-line-format=":%d:%L" --new-line-format=":%dn:%L"  file_1 file_2

que resulta em

:2:my second line
:2:my changed second line

Mas há dois problemas:

  • A opção lfmt não funciona com a opção recursiva -r
  • Eu não obtenho o nome do arquivo

Então, finalmente, a questão é:

Alguém sabe como diff dois diretórios de maneira que eu tenha a saída desejada acima?

    
por Olli 01.07.2014 / 09:33

1 resposta

2

Acho que isso deve fazer o que você precisa:

diff -r -U0 a/ b/ | awk '/^+++ / {filename=$2; next} /^@@ / {split($3,a,","); line=substr(a[1],2)} /^+/ {text=substr($0,2); print filename ":" line ":" text; line++}'

Basicamente, ele faz um diff recursivo comum e, em seguida, descarta o bit que você não deseja. O awk é legal para coisas assim.

diff -U0 fornece resultados assim:

--- a   2014-07-01 17:05:46.257447351 +0100
+++ b   2014-07-01 17:05:56.157524562 +0100
@@ -2 +2 @@
-my second line
+my changed second line

O script awk pega o nome do arquivo da linha +++ , o número da linha da linha @@ e o texto da linha + e depois os imprime com os dois-pontos que você queria:

file_2:2:my changed second line

EDIT: notei um erro de script se duas linhas juntas foram editadas. Corrigido agora.

    
por 01.07.2014 / 18:20