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: