Como comparar arquivos usando diff

Como comparar arquivos usando diff

A utilidade do diff é, na grande maioria dos casos, instalada por padrão em todas as distribuições Linux por aí. O programa é usado para calcular e exibir as diferenças entre o conteúdo de dois arquivos. Ele é usado principalmente ao trabalhar com o código -fonte dois compare as mesmas versões de dois arquivos e destaca as diferenças entre eles. Neste artigo, aprenderemos os vários modos nos quais o Diff pode funcionar e como criar um arquivo diff que pode ser aplicado mais tarde como um patch com o utilitário de patches.

Neste tutorial, você aprenderá:

  • Como usar o Diff
  • Como exibir a saída do diff em duas colunas ao usar o DIFF no modo normal
  • Como ler a saída Diff no modo normal, de contexto e unificado
  • Como criar um arquivo diff e aplicá -lo como um patch com o utilitário patch
Como comparar arquivos usando diff

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Distribuição Independente
Programas diff, patch
Outro Nenhum
Convenções # - requer que os comandos linux -comidos sejam executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular

A utilidade diff

O Dif O utilitário compara os arquivos alinhados por linha; Sua sintaxe é muito simples:

$ diff [opção] arquivos 

Tudo o que precisamos fazer é invocar o programa seguido pelo caminho dos arquivos que queremos comparar. Antes que possamos dar uma olhada em alguns exemplos de uso, precisamos aprender a ler a saída da utilidade e qual é o significado dos símbolos usados ​​na saída produzida por ele. Podemos resumi -los na tabela seguinte:

Símbolo Significado
a É necessária uma "adição" para que o conteúdo dos dois arquivos corresponda
c Uma ação de "mudança" é necessária para que o conteúdo dos dois arquivos corresponda
d É necessária uma ação de "excluir" para que o conteúdo dos dois arquivos corresponda
< Indica uma linha do primeiro arquivo
> Indica uma linha do segundo arquivo


Agora podemos ver alguns exemplos do uso básico de diferença. Suponha que tenhamos dois arquivos, chamados LOTR0.TXT e LOTR1.TXT. O conteúdo do primeiro arquivo é o seguinte:

Três anéis para os elven-reis sob o céu, sete para os candidatos anãs em seus corredores de pedra, nove para homens mortais condenados a morrer, um pelo Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras se encontram. Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os ligam, na terra de Mordor, onde as sombras estão # final 

Você certamente reconheceu o poema "anel" do livro "Senhor dos Anéis". Agora suponha que o segundo arquivo, LOTR1.TXT, Contém as seguintes linhas:

# O poema do anel no discurso negro de Mordor três anéis para os elven-rei sob o céu, sete para os senhoras anões em seus corredores de pedra, nove para homens mortais condenados a morrer, um para o Lorde das Trevas em seu trono escuro Na terra de Mordor, onde as sombras estão. Ash Nazg Durbatulûk, Ash Nazg Gimbatul, Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krippatul, na terra de Mordor, onde se encontram as sombras 

O conteúdo dos dois arquivos é bastante semelhante, mas não idêntico. Vamos correr o Dif utilidade neles e veja qual saída ele produz:

$ diff lotr0.txt lotr1.txt 0a1> # o poema do anel no discurso negro de Mordor 6,7c7,8 < One Ring to rule them all, One Ring to find them,  Ash nazg durbatulûk, ash nazg gimbatul, > Ash Nazg Thrakatulûk, Agh Burzum-ishi Krippatul, 9d9 < # end 

Na primeira linha da saída, podemos ler 0A1; O que isto significa? Nesse caso, somos notificados de que, para o primeiro arquivo, corresponder ao conteúdo do segundo, no início (linha 0), uma nova linha deve ser "adicionada" (a), que corresponde à primeira linha (1) do segundo arquivo. O que é esta linha? O relatado após o > Símbolo na segunda linha da saída:

> # O poema do anel no discurso negro de Mordor 

Isso faz sentido: a linha não existe no primeiro arquivo, por isso deve ser adicionado para o conteúdo dos dois arquivos para corresponder.

Vamos continuar. Podemos ver a seguinte notação 6,7c7,8: Isso significa que as linhas 6 para 7 No primeiro arquivo (6,7) deve ser alterado para corresponder às linhas 7 para 8 (7,8) int o segundo arquivo. Como eles devem ser alterados? As linhas do primeiro arquivo, que podemos distinguir porque precedido pelo < Símbolo, são:

< One Ring to rule them all, One Ring to find them, < One Ring to bring them all, and in the darkness bind them, 

Eles devem ser alterados para as seguintes linhas do segundo arquivo, que podem ser vistas porque são precedidas pelo > Símbolo na saída Diff:

> Ash Nazg Durbatulûk, Ash Nazg Gimbatul,> Ash Nazg Thrakatulûk, Agh Burzum-ishi Krippatul, 

As linhas do primeiro arquivo e as linhas do segundo, na saída, são separadas por três traços: (---).

Finalmente, temos o 9d9 Notação: isso significa que, para que o conteúdo dos dois arquivos corresponda, linha 9 No primeiro arquivo (# final) deve ser excluído para corresponder à linha 9 do segundo arquivo.

Exibindo a saída lado a lado

Nos exemplos acima, podemos ver que a saída produzida pela utilidade do diferencial é organizada "verticalmente". Se preferirmos, podemos fazer para que seja formatado e exibido usando duas colunas. Tudo o que precisamos fazer é usar o -y opção (curta
para --lado a lado):

$ diff -y lotr0.txt lotr1.txt> # o poema do anel no discurso negro de Mordor três anéis para os elven-kings sob o céu, três anéis para os elven-kings sob o céu, sete para os dwarf-lordes em seus salões de pedra, sete para o anão -Lortos em seus corredores de pedra, nove para homens mortais condenados a morrer, nove por homens mortais condenados a morrer, um pelo Senhor das Trevas em seu trono escuro para o senhor das trevas em seu trono escuro na terra de Mordor, onde as sombras mentira. Na terra de Mordor, onde as sombras estão. Um anel para governar todos eles, um anel para encontrá -los, | Ash Nazg Durbatulûk, Ash Nazg Gimbatul, um anel para trazer todos eles e, na escuridão, os prendem, | Ash Nazg Thrakatulûk, Agh Burzum-Ishi Kripsatul, na terra de Mordor, onde as sombras estão na terra de Mordor, onde as sombras estão # final < 

O conteúdo do primeiro arquivo é exibido na coluna esquerda e o do segundo, no direito. Podemos facilmente identificar as diferenças entre eles: que linhas existem apenas em um dos dois e que linhas são diferentes. O -y A opção só pode ser usada ao trabalhar com DIFF no modo "normal", que é o padrão. Outros modos existem: falamos sobre eles na próxima seção.

Modo normal, contexto e unificado

Por padrão, o utilitário diff funciona em normal modo e produz uma saída semelhante à que vimos nos exemplos anteriores. Existem, no entanto, outros dois modos que podemos usar: o contexto e unificado modo. Vamos dar uma olhada
para eles.

O modo de contexto

O modo de contexto pode ser usado invocando o programa com o -c opção, (abreviação de --contexto). No nosso caso, produziria a seguinte saída:

$ diff -c lotr0.txt lotr1.txt *** LOTR0.TXT 2021-03-13 16:10:25.248286081 +0100 --- LOTR1.TXT 2021-03-13 15:30:54.060911632 +0100 *************** *** 1,9 **** Três anéis para os elven-kings sob o céu, sete para os swarf-lordes em seus corredores de pedra , Nove para homens mortais condenados a morrer, um para o Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras estão. ! Um anel para governar todos eles, um anel para encontrá -los, ! Um anel para trazer todos eles e, na escuridão Os reis élficos sob o céu, sete para os candidatos anões em seus corredores de pedra, nove para homens mortais condenados a morrer, um pelo Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras se encontram. ! Ash Nazg Durbatulûk, Ash Nazg Gimbatul, ! Ash Nazg Thrakatulûk, Agh Burzum-Ishi Kripsatul, na terra de Mordor, onde as sombras estão 


Vamos dar uma olhada neste resultado. Primeiro de tudo, podemos ver que os dois arquivos são referenciados usando diferentes símbolos: *** para o primeiro e --- para o segundo.

As duas primeiras linhas fornecem informações sobre os dois arquivos. Nós podemos ver:

  • O nome do arquivo
  • O tempo de modificação do arquivo com o fuso horário (+0100 neste caso)

As duas primeiras linhas são separadas do restante da saída por 15 asterisco (*****************).

O que vemos imediatamente após o separador é a notação que especifica qual é a faixa de linhas do primeiro arquivo relatado na saída, neste caso as linhas 1 a 9 (1,9). Após essa notação, as próprias linhas são relatadas. O mesmo acontece para o segundo arquivo. Podemos ver que certas linhas são precedidas por alguns símbolos; Vamos ver qual é o significado deles:

Símbolo Significado
! As linhas prefixadas por esse símbolo no primeiro arquivo precisam ser alteradas para as linhas precedidas por ele no segundo arquivo, para que o conteúdo dos dois arquivos corresponda
- As linhas precedidas por este símbolo no primeiro arquivo devem ser excluídas para que o conteúdo dos dois arquivos corresponda
+ As linhas no segundo arquivo precedidas por este símbolo devem ser adicionadas ao primeiro arquivo para o conteúdo dos dois arquivos para corresponder

O modo unificado

Para usar o Dif utilidade no modo "unificado", devemos invocá -lo usando o -você opção, que é a forma curta de --unificado. É assim que a saída do DIFF no modo unificado ficaria neste caso:

$ diff -u lotr0.txt lotr1.txt --- lotr0.TXT 2021-03-13 16:10:25.248286081 +0100 +++ LOTR1.TXT 2021-03-13 15:30:54.060911632 +0100 @@ -1,9 +1,9 @@ +# o poema do anel no discurso negro de Mordor três anéis para os elven-rei sob o céu, sete para os lordes da anão em seus salões de pedra, nove Para homens mortais condenados a morrer, um para o Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras estão. -Um anel para governar todos eles, um anel para encontrá -los, um anel para trazê -los todos e, na escuridão, os prendem, +ash nazg durbatulûk, ash nazg gimbatul, +ash nazg thrakatulûk, agh burzum -ishi kriptul, no nazg, no que Terra de Mordor onde as sombras estão -# fim 

As duas primeiras linhas produzidas quando o diff é invocado com o -você opção, são os mesmos do modo "contexto" e exibe informações sobre os dois arquivos. A única grande diferença aqui é que a saída não está separada, dependendo do arquivo ao qual pertence: todas as linhas são "unificadas".

Criando um arquivo diff e aplicá -lo como um patch

Suponha que queremos aplicar as alterações necessárias ao conteúdo do primeiro arquivo que usamos nos exemplos anteriores, LOTR0.TXT, para que seja atualizado para corresponder ao conteúdo do segundo arquivo, LOTR1.TXT; Como procederíamos? Para atingir nosso objetivo, podemos usar o correção utilidade e aplique um arquivo diff para o original. A arquivo diff Contém a saída do DIFF, para criar um, tudo o que precisamos fazer é redirecionar a saída do utilitário:

$ diff -u lotr0.txt lotr1.txt> lotr.correção 


Depois de termos nosso arquivo DIFF, podemos aplicar as alterações necessárias no arquivo original usando o utilitário patch:

$ patch -b lotr0.txt lotr.correção 

Nós invocamos correção usando o -b Opção: isso não é obrigatório, mas é útil, pois faz com que um backup do arquivo original seja criado antes que o patch seja aplicado (neste caso, será nomeado LOTR0.TXT.orig). Os argumentos nós
Fornecido são:

  • O nome do arquivo original no qual o patch deve ser aplicado
  • O nome do arquivo que contém o patch.

Depois que o patch é aplicado, o LOTR0.TXT o arquivo deve ser idêntico a LOTR1.TXT. Podemos verificá -lo usando o DIFF novamente, que desta vez não deve produzir saída:

$ diff lotr0.txt lotr1.TXT 

Conclusões

Neste tutorial, aprendemos a usar o DIFF para calcular as diferenças entre dois arquivos. Vimos quais são os modos em que o diferencial pode ser usado e qual é o significado dos símbolos usados ​​na saída do diferencial. Finalmente vimos como criar um arquivo diff e como aplicá -lo como um patch usando o utilitário patch.

Tutoriais do Linux relacionados:

  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Mastering Bash Script Loops
  • Coisas para instalar no Ubuntu 20.04
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Tutorial de depuração do GDB para iniciantes
  • Como reconstruir um pacote usando o sistema de construção do arco Linux
  • Loops aninhados em scripts de basquete
  • Como montar a imagem ISO no Linux
  • Sistema Linux Hung? Como escapar para a linha de comando e…
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux