diff - Comando com exemplos

Publicado por Lisandro Guerra em 24/06/2013

[ Hits: 125.558 ]

Blog: https://spartanix.com/

 


diff - Comando com exemplos



O comando diff compara o conteúdo de dois arquivos e relata a diferença entre eles. Mas, o comando não compara apenas arquivos, também pode comparar diretórios ou pastas, e até arquivos compactados com gzip diretamente.

Sabendo das possibilidades, vamos agora então conhecer melhor o comando, pois a saída dele não é exatamente o que se pode chamar de amigável.

Sintaxe: diff [opções] [arquivo1] [arquivo2]

Opções:
  • -i :: ignora as diferenças de letras maiúsculas/minúsculas.
  • -E :: ignora as diferenças de tabulação.
  • -b :: ignora diferenças na quantidade de espaço em branco.
  • -w :: ignora qualquer espaço em branco.
  • -B :: ignora linhas em branco a mais ou a menos.
  • -a :: compara os arquivos como arquivos de texto, ainda que não sejam.
  • -u [n] :: mostra [n] linhas do conteúdo final do arquivo1, adicionadas as diferenças do arquivo2.
  • -q :: mostra apenas se o conteúdo dos arquivos são ou não diferentes.
  • -y :: mostra os arquivos em duas colunas, indicando as diferenças.
  • -t :: expande as tabulações, convertendo-as em espaços, na saída.
  • -r :: compara recursivamente todo o conteúdo de um diretório.
  • -S [arquivo] :: quando comparar diretórios, inicia a comparação pelo arquivo especificado.

Para os exemplos criei, dois arquivos com listas da feira e listo eles abaixo com o comando cat:

cat lista1
Lista da feira
Alface
Beterraba
Cebola
Caqui
Damasco
Espinafre
Goiaba

cat lista2
Lista da feira
Alface americana
Beterraba
Caqui
Damasco
Espinafre
Figo
Goiaba

O comando reporta, basicamente, o que tem que ser alterado no arquivo1, o primeiro na sintaxe, para que fique igual ao arquivo2. Então, se seguirmos a lógica e a ordem numérica colocando a lista1 primeiro, teremos o seguinte:

diff lista1 lista2
2c2
< Alface
---
> Alface americana
4d3
< Cebola
7a7
> Figo

Podemos dizer que a saída mostra que, para a lista1 ficar igual à lista2, devemos fazer algumas alterações.

Vejamos:

2c2  // o primeiro número é a linha, no caso a linha 2, da lista1 que deve ser modificada e a letra "c" é de change ou trocar em português.
< Alface  // o símbolo menor que "<" indica que deve ser retirada a informação que lhe segue.
---  // aqui separa da informação a ser substituída.
> Alface americana  // o símbolo maior que ">" indica que deve ser incluída a informação.
4d3  // continuando na linha 4 devemos deletar "d" a informação
< Cebola  // o símbolo menor que "<" indica que deve ser retirada a informação que lhe segue.
7a7  // por fim, na linha 7 devemos adicionar "a" a informação
> Figo  // o símbolo maior que ">" indica que deve ser incluída a informação.

Traduzindo: na linha 2 trocamos Alface por Alface americana, na linha 4 devemos apagar a Cebola e na linha 7, devemos incluir o Figo.

Agora, se quiséssemos saber quais modificações necessárias para que a lista2 ficasse como a lista1, o comando e a resposta ficariam assim:

diff lista2 lista1
2c2
< Alface americana
---
> Alface
3a4
> Cebola
7d7
< Figo

Traduzindo: na linha 2, trocar Alface americana por Alface, entre as linhas 3 e 4 incluir a Cebola, que passará a ser a nova linha 4 e na linha 7, retirar o Figo.

Lembrando que também podemos guardar as diferenças em um terceiro arquivo, chamado, por exemplo, "difere". Assim:

diff lista1 lista2 > difere

Uma das opções que chama a atenção é "-y", que compara formando duas colunas, talvez não seja muito eficiente para arquivos de 15000 linhas, mas para nossas listas aqui, o resultado é interessante:

diff -y lista1 lista2
Lista da feira           Lista da feira
Alface                   | Alface americana
Beterraba                Beterraba
Cebola                   <
Caqui                    Caqui
Damasco                  Damasco
Espinafre                Espinafre
                         > Figo
Goiaba                   Goiaba

Comparando arquivos compactados

Compactei as listas para testarmos se o resultado será o mesmo com os arquivos compactados, e o resultado do comando foi:

diff lista1.gz lista2.gz
Os arquivos binários lista1.gz e lista2.gz são diferentes

Opa! Não era o que eu esperava, o comando apenas disse que os arquivos são diferentes. É que, para comparar os arquivos compactados, temos que usar o zdiff:

zdiff lista1.gz lista2.gz
2c2
< Alface
---
> Alface americana
4d3
< Cebola
7a7
> Figo

Agora sim, recebemos a resposta esperada.

Comparando pastas

O que o comando faz neste caso, é comparar o conteúdo das pastas, quais arquivos uma tem e a outra não. Para isso, coloquei os arquivos que utilizamos anteriormente nesta dica, na pasta1 e na pasta2, eu omiti um deles e acrescentei um estranho.

Veja como ficou o comando e o resultado:

diff pasta1/ pasta2/
Somente em pasta1/: difere
Somente em pasta2/: lista3

Como podemos deduzir, eu omiti o arquivo "difere" e incluí o arquivo "lista3", daí o comando disse que existe o arquivo "difere" somente na pasta1 e o "lista3", somente na pasta2.

Por hora, era isso. Abraços.

Fontes:
Outras dicas deste autor

Vim editor - inserir e retirar numeração de linhas

Linux Mint e Ubuntu - Instalação do OpenSCAD 2015.3

Nepomuk - Desabilitando no KDE

Wi-Fi no Dell Inspiron 1525 - Configurando Broadcom 4312 LP-PHY no Linux Mint 14/15

Data e hora do sistema

Leitura recomendada

Imprima textos inteiros com o comando "echo"

E-book GRATUITO de Shell Script do Júlio Neves

Três formas de executar HTTP Request em Shell Script

Capturando os últimos artigos do VivaoLinux

Automatização da instalação do plugin JAVA (Mozilla)

  

Comentários
[1] Comentário enviado por jlromano em 10/10/2013 - 12:22h

Muito bom o artigo, irei usar como "cola" para algumas operações hehe

[2] Comentário enviado por removido em 17/04/2017 - 18:55h

Lisandro,

Excelente!!!
Favoritado.

*******************************************************
* https://www.linuxcounter.net/cert/620448.png *
*******************************************************

[3] Comentário enviado por removido em 29/05/2017 - 23:47h


+1

Boa dica.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts