Precisa ver as diferenças entre duas revisões de um arquivo de texto? Então diff é o comando de que você precisa. Este tutorial mostra como usar o diff no Linux e macOS da maneira mais fácil.
últimas postagens
Mergulhando no diff
O comando diff compara dois arquivos e produz uma lista das diferenças entre os dois. Para ser mais preciso, ele produz uma lista das alterações que precisariam ser feitas no primeiro arquivo para torná-lo compatível com o segundo arquivo. Se você mantiver isso em mente, será mais fácil entender a saída do diff. O comando diff foi projetado para encontrar diferenças entre os arquivos de código-fonte e para produzir uma saída que pudesse ser lida e trabalhada por outros programas, como o correção comando. Neste tutorial, vamos dar uma olhada nas formas amigáveis mais úteis de usar o diff.
Vamos mergulhar de cabeça e analisar dois arquivos. A ordem dos arquivos na linha de comando determina qual arquivo diff considera ser o ‘primeiro arquivo’ e qual ele considera ser o “segundo arquivo”. No exemplo abaixo, alpha1 é o primeiro arquivo e alpha2 é o segundo arquivo. Ambos os arquivos contêm o alfabeto fonético mas o segundo arquivo, alpha2, teve algumas edições adicionais para que os dois arquivos não sejam idênticos.
Podemos comparar os arquivos com este comando. Digite diff, um espaço, o nome do primeiro arquivo, um espaço, o nome do segundo arquivo e pressione Enter.
diff alpha1 alpha2
Como dissecamos essa saída? Depois de saber o que procurar, não é tão ruim. Cada diferença é listada por sua vez em uma única coluna e cada diferença é rotulada. A etiqueta contém números nos dois lados de uma letra, como 4c4. O primeiro número é o número da linha em alfa1 e o segundo número é o número da linha em alfa2. A letra do meio pode ser:
c: A linha no primeiro arquivo precisa ser alterada para coincidir com a linha no segundo arquivo.
d: A linha no primeiro arquivo deve ser excluída para corresponder ao segundo arquivo.
a: O conteúdo extra deve ser adicionado ao primeiro arquivo para fazê-lo corresponder ao segundo arquivo.
O 4c4 em nosso exemplo nos diz que a linha quatro de alfa1 deve ser alterada para corresponder à linha quatro de alfa2. Esta é a primeira diferença entre os dois arquivos que o diff encontrou.
As linhas que começam com referem-se ao segundo arquivo, alpha2. A linha Dave nos diz que a palavra Dave é o conteúdo da linha quatro em alpha2. Para resumir então, precisamos substituir Delta por Dave na linha quatro em alpha1, para fazer com que essa linha corresponda em ambos os arquivos.
A próxima mudança é indicada por 12c12. Aplicando a mesma lógica, isso nos diz que a linha 12 em alpha1 contém a palavra Lima, mas a linha 12 de alpha2 contém a palavra Linux.
A terceira alteração refere-se a uma linha que foi excluída de alpha2. O rótulo 21d20 é decifrado como “a linha 21 precisa ser excluída do primeiro arquivo para fazer ambos os arquivos sincronizarem a partir da linha 20”. O
A quarta diferença é rotulada como 26a26,28. Essa alteração se refere a três linhas extras que foram adicionadas a alpha2. Observe o 26,28 no rótulo. Os números de duas linhas separados por uma vírgula representam um intervalo de números de linha. Neste exemplo, o intervalo vai da linha 26 à linha 28. O rótulo é interpretado como “na linha 26 do primeiro arquivo, adicione as linhas 26 a 28 do segundo arquivo”. São mostradas as três linhas em alpha2 que precisam ser adicionadas a alpha1. Eles contêm as palavras peculiar, estranho e charme.
Snappy One-Liners
Se você só deseja saber se dois arquivos são iguais, use a opção -s (relatar arquivos idênticos).
diff -s alpha1 alpha3
Você pode usar a opção -q (breve) para obter uma declaração igualmente concisa sobre dois arquivos serem diferentes.
diff -q alpha1 alpha2
Uma coisa a se observar é que, com dois arquivos idênticos, a opção-q (breve) se fecha completamente e não relata absolutamente nada.
Uma visão alternativa
A opção -y (lado a lado) usa um layout diferente para descrever as diferenças do arquivo. Freqüentemente, é conveniente usar a opção -W (largura) com a visualização lado a lado, para limitar o número de colunas que são exibidas. Isso evita linhas feias que tornam a saída difícil de ler. Aqui, dissemos ao diff para produzir uma exibição lado a lado e limitar a saída a 70 colunas.
diff -y -W 70 alpha1 alpha2
O primeiro arquivo na linha de comando, alpha1, é mostrado à esquerda e a segunda linha na linha de comando, alpha2, é mostrado à direita. As linhas de cada arquivo são exibidas, lado a lado. Existem caracteres indicadores ao lado dessas linhas em alpha2 que foram alterados, excluídos ou adicionados.
|: Uma linha que foi alterada no segundo arquivo.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Uma linha que foi adicionada ao segundo arquivo que não está no primeiro arquivo.
Se você preferir um resumo lado a lado mais compacto das diferenças do arquivo, use a opção –suppress-common-lines. Isso força o diff a listar apenas as linhas alteradas, adicionadas ou excluídas.
diff -y -W 70 --suppress-common-lines alpha1 alpha2
Adicione um toque de cor
Outro utilitário chamado colordiff adiciona realce de cor à saída do diff. Isso torna muito mais fácil ver quais linhas têm diferenças.
Use apt-get para instalar este pacote em seu sistema se estiver usando Ubuntu ou outra distribuição baseada em Debian. Em outras distribuições Linux, use a ferramenta de gerenciamento de pacotes da distribuição Linux.
sudo apt-get install colordiff
Use colordiff da mesma forma que usaria diff.
Na verdade, colordiff é um invólucro para diff, e diff faz todo o trabalho nos bastidores. Por causa disso, todas as opções do diff funcionarão com o colordiff.
Fornecendo Algum Contexto
Para encontrar um meio-termo entre ter todas as linhas nos arquivos exibidos na tela e ter apenas as linhas alteradas listadas, podemos pedir a diff para fornecer algum contexto. Existem duas maneiras de fazer isso. Ambas as formas alcançam o mesmo propósito, que é mostrar algumas linhas antes e depois de cada linha alterada. Você poderá ver o que está acontecendo no arquivo no local onde a diferença foi detectada.
O primeiro método usa a opção -c (contexto copiado).
colordiff -c alpha1 alpha2
A saída do diff tem um cabeçalho. O cabeçalho lista os dois nomes de arquivo e seus horários de modificação. Existem asteriscos
antes do nome do primeiro arquivo e travessões (-) antes do nome do segundo arquivo. Asteriscos e travessões serão usados para indicar a qual arquivo as linhas na saída pertencem.
Uma linha de asteriscos com 1,7 no meio indica que estamos olhando para linhas de alfa1. Para ser preciso, estamos analisando as linhas um a sete. A palavra Delta é marcada como alterada. Ele tem um ponto de exclamação (!) Ao lado e é vermelho. Existem três linhas de texto inalterado exibidas antes e depois dessa linha, para que possamos ver o contexto dessa linha no arquivo.
A linha de traços com 1,7 no meio nos diz que agora estamos olhando para linhas de alpha2. Novamente, estamos olhando as linhas um a sete, com a palavra Dave na linha quatro sinalizada como diferente.
colordiff -C 2 alpha1 alpha2
Três linhas de contexto acima e abaixo de cada alteração é o valor padrão. Você pode especificar quantas linhas de contexto deseja que o diff forneça. Para fazer isso, use a opção -C (contexto copiado) com um “C” maiúsculo e forneça o número de linhas que deseja:
colordiff -u alpha1 alpha2
A segunda opção diff que oferece contexto é a opção -u (contexto unificado).
Como antes, temos um cabeçalho na saída. Os dois arquivos são nomeados e seus horários de modificação são mostrados. Existem travessões (-) antes do nome de alfa1 e sinais de adição (+) antes do nome de alfa2. Isso nos diz que os traços serão usados para se referir a alfa1 e os sinais de mais serão usados para se referir a alfa2. Espalhadas por toda a lista estão as linhas que começam com os sinais (@). Essas linhas marcam o início de cada diferença. Eles também nos informam quais linhas estão sendo mostradas de cada arquivo.
São mostradas as três linhas antes e depois da linha sinalizada como diferente para que possamos ver o contexto da linha alterada. Na visualização unificada, as linhas com a diferença são mostradas uma acima da outra. A linha de alpha1 é precedida por um traço e a linha de alpha2 é precedida por um sinal de mais. Esta exibição atinge em oito linhas o que a exibição de contexto copiado acima demorou quinze para fazer.
colordiff -U 2 alpha1 alpha2
Como seria de esperar, podemos pedir a diff para fornecer exatamente o número de linhas de contexto unificado que gostaríamos de ver. Para fazer isso, use a opção -U (contexto unificado) com um “U” maiúsculo e forneça o número de linhas que você deseja:
Ignorando espaço em branco e maiúsculas e minúsculas
colordiff -y -W 70 test4 test5
Vamos analisar outros dois arquivos, test4 e test5. Estes têm os nomes de seis super-heróis.
Os resultados mostram que diff não encontra nada diferente com as linhas Viúva Negra, Homem-Aranha e Thor. Ele sinaliza mudanças com as linhas Capitão América, Ironman e The Hulk.
Então, o que é diferente? Bem, em test5 Hulk é escrito com um “h” minúsculo e o Capitão América tem um espaço extra entre “Capitão” e “América”. OK, isso é fácil de ver, mas o que há de errado com a linha Ironman? Não existem diferenças visíveis. Esta é uma boa regra prática. Se você não consegue ver, a resposta é um espaço em branco. É quase certo que haja um ou dois espaços perdidos, ou um caractere de tabulação, no final dessa linha.
Se eles não importarem para você, você pode instruir diff para ignorar tipos específicos de diferença de linha, incluindo:
-i: Ignora diferenças de maiúsculas e minúsculas.
-Z: Ignora o espaço em branco à direita.
-b: Ignora as alterações na quantidade de espaço em branco.
-w: Ignora todas as alterações de espaço em branco.
colordiff -i -y -W 70 test4 test5
Vamos pedir ao diff para verificar esses dois arquivos novamente, mas desta vez para ignorar quaisquer diferenças de maiúsculas e minúsculas.
colordiff -i -Z -y -W 70 test4 test5
As linhas com “The Hulk” e “The hulk” agora são consideradas uma correspondência, e nenhuma diferença é sinalizada para “h” minúsculo. Vamos pedir a diff para também ignorar o espaço em branco à direita.
colordiff -i -w -y -W 70 test4 test5
Como suspeito, o espaço em branco deve ter sido a diferença na linha do Ironman, porque o diff não sinaliza mais uma diferença para essa linha. Isso deixa o Capitão América. Vamos pedir a diff para ignorar maiúsculas e minúsculas e ignorar todos os problemas de espaço em branco.
Dizendo ao diff para ignorar as diferenças com as quais não estamos preocupados, o diff nos diz que, para nossos propósitos, os arquivos correspondem. O comando diff tem muito mais opções, mas a maioria delas está relacionada à produção de saída legível por máquina. Estes podem ser revisados no Linuxpágina man
. As opções que usamos nos exemplos acima permitirão que você rastreie todas as diferenças entre as versões de seus arquivos de texto, usando a linha de comando e olhos humanos.