Como comparar arquivos no Linux com cmp, comm, diff e sdiff

Comparar arquivos no Linux com cmp, comm, diff e sdiff

Neste tutorial vamos estudar algumas ferramentas que nos permitem realizar a comparação de arquivos de texto no Linux, de acordo com o seu conteúdo. As ferramentas a serem estudadas são as seguintes:

  • cmp
  • comm
  • diff
  • sdiff

Vamos aos comandos.

Comando cmp

O comando cmp compara o conteúdo de dois arquivos e envia o resultado para a saída padrão.

Usa-se o comando cmp para arquivos que não são de texto para verificar se são idênticos. Para comparar arquivos de texto, use o comando diff.

Se os arquivos forem idênticos, não será gerada nenhuma saída.

Caso haja diferenças, serão mostrados o número da linha e do byte da primeira posição diferente entre eles.

Algumas opções do cmp

-l
Mostrar, para cada diferença, o número do byte em decimal e os bytes diferentes em octal.

-s
Retorna apenas um status de saída (exit code) sem gerar nenhuma saída. Os valores de saída são: 0 para arquivos idênticos, 1 se os arquivos forem diferentes ou 2 se o comando cmp não conseguir comparar os arquivos.

Esse flag é muito útil em scripts do shell.

Para ver o status de saída, execute a comparação com cmp -s e logo após execute o comando echo $?

Exemplos:

1. Copie para seu home (/root) os arquivos which e zegrep (entre no /root antes):

# cp /bin/which .
# cp /bin/zegrep .

2. Faça uma segunda cópia do arquivo which:

# cp which which2

3. Vamos comparar os arquivos:

# cmp which which2
# cmp which zegrep

4. Usando a opção -l:

# cmp -l which zegrep

5. Usando a opção -s:

# cmp -s which zegrep
# echo $?

Comando comm

O comando comm é usado para comparar arquivos de texto que estejam com os dados ordenados.

O resultado da comparação é gerado na saída padrão em três colunas, na ordem a seguir:

  1. Linhas que existem apenas no primeiro arquivo
  2. Linhas que existem apenas no segundo arquivo
  3. Linhas que existem em ambos os arquivos.

O comando comm pode ser usado para incluir ou excluir linhas em comum nos arquivos na exibição do resultado.

Podemos usar algumas flags:

-1
Para suprimir a exibição da primeira coluna

-2
Para suprimir a exibição da segunda coluna

-3
Para suprimir a exibição da terceira coluna

Vamos testar o comando comm:

1. Crie um arquivo de texto denominado teste-comm:

# vi teste-comm

2. Digite o conteúdo a seguir no arquivo:

Arara
Bem-Te-Vi
Pardal
Sabiá
Tucano
Uirapuru

3. Faça uma cópia do arquivo:

# cp teste-comm teste-comm2

4. Vamos testar o comando:

# comm teste-comm teste-comm2

Só aparecerá a terceira coluna, pois o conteúdo dos arquivos é idêntico.

5. Altere o arquivo teste-comm adicionando a palavra Mutum antes de Pardal:

# vi teste-comm

6. Rode a comparação novamente:

# comm teste-comm teste-comm2

Aparecerá a palavra Mutum na primeira coluna, significando que essa linha spo existe no arquivo teste-comm, e na terceira coluna aparecerão as linhas em comum.

7. Altere o arquivo teste-comm2, adicionando a palavra Gaivota antes de Mutum.

Rode a comparação novamente e veja os resultados:

# comm teste-comm teste-comm2

8. Se estivermos interessados somente nas linhas que são idênticas em ambos os arquivos, podemos suprimir a exibição das colunas 1 e 2:

# comm -12 teste-comm teste-comm2

9. E, finalmente, se quisermos ver somente as diferenças entre os arquivos, excluimos a coluna 3 dos resultados:

# comm -3 teste-comm teste-comm2

Comando diff

Podemos comparar arquivos de texto com o comando diff (mas não arquivos binários).

A saída do comando diff traz as seguintes informações:

  • Linhas que são diferentes no primeiro arquivo
  • Código de ação: “O que deve ser feito para que os arquivos se tornem idênticos”: a para adicionar linhas após, c para modificar linhas e d para excluir linhas.
  • Linhas que são diferentes no segundo arquivo.

Alguns flags úteis:

-b
Considerar que mais de um espaço ou tabulações sejam consideradas como um único caractere.

-i
Comparar os arquivos ignorando maiúsculas e minúsculas.

-l
Para gerar saída formatada, com um sumário no final.

-w
Ignorar todos os caracteres de espaço e tabulação.

Exemplo:

1. Execute o comando a seguir para comparar os arquivos teste-comm e teste-comm2:

# diff teste-comm teste-comm2

Será retornado o resultado a seguir:

3c3
< Mutum
---
> Gaivota

Isso significa que devemos modificar a linha 3 no primeiro arquivo pela linha 3 do segundo para que se tornem idênticos. Ou seja, alterar Mutum para Gaivota.

2. Vamos introduzir mais modificações nos arquivos. Em teste-comm acrescente a linha “João-de-Barro” antes de Mutum, e rode novamente o teste:

# diff teste-comm teste-comm2

Aparecerá o resultado a seguir:

3,4c3
< Mutum
---
> Gaivota

Significa: “modifique as linhas de 3 a 4 no arquivo1 para o valor da linha 3 do arquivo2, assim eles ficarão idênticos”.

3. Modifiquemos agora o arquivo teste-comm2. Acrescente a linha “Tico-tico” antes do Tucano e rode o teste novamente:

# diff teste-comm teste-comm2

Aparecerá o resultado a seguir:

3,4c3
< João-de-Barrp
< Mutum
---
> Gaivota
6a6
> Tico-tico

Significa: “modifique as linhas de 3 a 4 no arquivo1 para o valor da linha 3 do arquivo2, e adicione após a linha 6 do arquivo 1 o conteúdo da linha 6 do arquvo 2, assim eles ficarão idênticos”.

Para entender melhor essa saída, limpe a tela e digite os comandos a seguir para exibir o conteúdo dos dois arquivos e contar a linhas para compará-las:

# cat teste-comm
# cat teste-comm2

Veja que adicionando após a sexta linha de teste-comm (Sabiá) a palavra Tico-tico, o arquivo ficará idêntico ao teste-comm2, cuja 6 linha é a palavra Tico-tico também.

4. Podemos também usar o comando diff para comparar o conteúdo em dois diretórios distintos. Para isso, crie os diretórios dir1 e dir2:

# mkdir dir1 dir2
# ls

5. Copie os arquivos teste-comm e teste-comm2 para ambos os diretórios:

# cp teste* ./dir1
# cp teste* ./dir2

# ls ./dir1
# ls ./dir2

6. Rode a comparação entre os diretórios com o diff:

# diff dir1 dir2

Nada aparecerá, pois ambos possuem o mesmo conteúdo. Agora apague teste-comm2 do diretório dir2:

# rm ./dir2/teste-comm2
# ls ./dir2

E rode novamente a comparação:

# diff dir1 dir2

Aparecerá a mensagem: “Somente em dir1: teste-comm2“, indicando que esse arquivo só está presente no diretório dir1.

Com a opção -s podemos ver quais arquivos são idênticos também:

# diff -s dir1 dir2

Comando sdiff

O comando sdiff compara dois arquivos e mostra na saída uma tabela com informações sobre a comparação:

  • Se linhas forem idênticas, são mostradas em cada lado da tabela, separadas apenas por espaços.
  • Se uma linha existe apenas no arquivo1, um sinal < é mostrado no final da linha da tabela.
  • Se uma linha existe apenas no segundo arquivo, um sinal > é mostrado.
  • Se duas linhas forem diferentes, uma barra de pipe | é mostrada entre elas

Algumas opções:

-s
Não mostrar linhas idênticas

Testando:

1. Execute o comando a seguir:

# sdiff teste-comm teste-comm2

2. Usando flags:

Mostrar somente linhas diferentes:

# sdiff -s teste-comm teste-comm2

É isso aí!

Sobre Fábio dos Reis (1329 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*