quinta-feira, 12 de janeiro de 2017

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


Fontes:






 
 
 
 

0 comentários: