Como faço para recursivamente diff dois diretórios e ignorar as primeiras n linhas de cada arquivo

0

Esta questão é semelhante a Como diferenciar apenas a primeira linha de dois arquivos? , mas recursivamente. Eu gostaria de diferenciar dois diretórios, mas:

  • diff apenas as primeiras N linhas de cada arquivo nos dois diretórios
  • diff tudo exceto as primeiras N linhas de cada arquivo nos dois diretórios
lanoxx
fonte
Normalmente você pode comparar usando diff -r dir1 dir2. Você também pode jogar com -I RE opção para ignorar certas linhas correspondentes.
kenorb
Por que você quer ignorar as primeiras n linhas? Qual sua motivação / cenário?
kenorb
Porque eles contêm um metadado sem importância, como hora, data, título que eu não estou interessado, em vez disso eu só quero comparar os dados dos arquivos.
lanoxx

Respostas:

1

Minha primeira sugestão para você é usar Meld . Ele funciona a partir da linha de comando também.

Tem o seguinte características que pode lhe interessar:

  • Compare dois ou três diretórios, arquivo por arquivo, mostrando arquivos novos, ausentes e alterados.
  • Use a filtragem de texto regex integrada para ignorar as diferenças não interessantes.

A única coisa que você precisa fazer é descobrir os padrões de regex corretos que podem ser usados ​​para ignorar os dados sem importância (dependendo da sintaxe de seus metadados que você deseja ignorar).

kenorb
fonte
0

Esses dois loops usam diff -qr fazer um diff inicial, principalmente para obter os nomes dos arquivos facilmente, faça um diff individual no encontrou um par de arquivos. sed é usado para limpar as primeiras N linhas, ou para manter apenas as primeiras N linhas. Primeiro para limpar as linhas N:

N=2
diff -qr dir1 dir2 |
grep '^Files.*differ' |
while read x a x b x
do  diff --label "$a" --label "$b" -u <(sed "1,${N}s/.*//" <"$a") <(sed "1,${N}s/.*//" <"$b")
done

E isso para manter N:

diff -qr dir1 dir2 |
grep '^Files.*differ' |
while read x a x b x
do  diff --label "$a" --label "$b" -u <(sed -n "1,${N}p" <"$a") <(sed -n "1,${N}p" <"$b")
done

Isso não assume espaços / guias em nomes de arquivos.

meuh
fonte