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

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.