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