De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


O comando cmp

Colaboração: Julio Cezar Neves

Data de Publicação: 18 de agosto de 2023

Sempre que você for comparar vários pares de arquivos, se seu interesse for simplesmente saber se são iguais ou não, aconselho o uso do cmp, pois ele aborta imediatamente ao achar uma diferença sem perder tempo para leitura/análise completa de ambos.

Sempre que você for comparar vários pares de arquivos, se seu interesse for simplesmente saber se são iguais ou não, aconselho o uso do cmp, pois ele aborta imediatamente ao achar uma diferença sem perder tempo para leitura/análise completa de ambos.

Para criar exemplos, vamos numerar as linhas e exibir os arquivos frutas e frutas1:

$ paste <(seq 7) frutas frutas1
1	abacate	abacate
2	banana	maçã
3	maçã	melancia
4	morango	morango
5	pera	pera
6	tâmara	tâmara
7	uva	uva

Para comparar rapidamente os arquivos, poderíamos fazer:

$ cmp frutas frutas1
frutas e frutas1 são diferentes: byte 9, linha 2

No primeiro erro ele abortou… Para termos mais detalhes do que ocorreu, podemos usar a opção -b. Veja como ficaria:

$ cmp -b frutas frutas1
frutas e frutas1 são diferentes: byte 9, linha 2 é 142 b 155 m

Onde o utilitário indica que a diferença ocorreu na linha 2, entre o b de banana (octal 142) e o m de melancia (octal 155)

Mas para efeito de programação, o cmp tem a opção -s (silent) que não gera nenhuma saída, exceto o $?. Sob controle do programador, veja como seria o mesmo teste:

$ cmp -s frutas frutas1 && echo Iguais || echo Diferentes
Diferentes

Este utilitário também permite comparações entre binários. Veja:

$ cmp -s Comp.odt Comp.odt && echo Iguais || echo Diferentes
 Iguais 
$ cmp -s Comp.odt Comp1.odt && echo Iguais || echo Diferentes
 Diferentes 

Nos 2 exemplos acima, Comp.odt e Comp1.odt são oriundos da salva deste texto em momentos distintos de sua evolução.

O cmp, como diversos utilitários, também substitui o hífen (-) pelos dados oriundos da entrada primária. Vejamos isso de 3 formas distintas, da pior (porque normalmente é a mais usada) para a melhor:

$ seq 3 > num1        # Preparando num1
$ seq 4 > num2        # Preparando num2
$ paste num1 num2     # Exibindo ambos
1	1
2	2
3	3
	4

$ cat num1 | cmp - num2        
cmp: Fim de arquivo (EOF) em - após byte 6, linha 3
$ echo "$(< num1)" | cmp - num2
cmp: Fim de arquivo (EOF) em - após byte 6, linha 3
$ cmp - num2 < num1            
cmp: Fim de arquivo (EOF) em - após byte 6, linha 3

A mensagem de EOF ocorre quando dois arquivos são iguais, porém um deles tem linhas a mais ao final.

Usando a opção -i N (ignore initial) podemos ignorar os N bytes iniciais, de ambos os arquivos, veja:

$ cmp arq1 arq2
arq1 e arq2 são diferentes: byte 6, linha 2
$ cmp -i6 arq1 arq2
$ vi arq1
$ cmp -i6 arq1 arq2 && echo Iguais
Iguais

Mas também podemos usar a sintaxe -i N1:N2, onde N1 é a quantidade de bytes que deve ser saltados no primeiro arquivo e N2 no segundo.

Veja também os outros artigos da série sobre comparação de arquivos:

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários (1)

Avatar
Novo

Dicazinha de ouroo!



Veja a relação completa dos artigos de Julio Cezar Neves