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:
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários (1)
Dicazinha de ouroo!