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 diff

Colaboração: Julio Cezar Neves

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

Direto ao que interessa… Eu tenho os dois arquivos idiotas a seguir:

$ cat arqA
Tomar leite à noite me ajuda a dormir
Porque dormir faz bem à saúde
Gosto também de ir ao cinema,
desde que esteja com alguém interessante.

$ cat arqB
Tomar vinho à noite me ajuda a dormir
Porque dormir faz bem à saúde
Gosto também de ir à praia,
desde que esteja com alguém interessante.
Afinal é melhor só que mal acompanhado.

Cujas diferenças são:

$ diff arqA arqB
1c1
< Tomar leite à noite me ajuda a dormir
—-
> Tomar vinho à noite me ajuda a dormir
3c3
< Gosto também de ir ao cinema,
—-
> Gosto também de ir à praia,
4a5
> Afinal é melhor só que mal acompanhado.

1c1 Trocar (c) a linha 1 de arqA pela pela linha 1 de arqB excluindo (<) o texto e incluindo (>) o outro texto;
3c3 Idêntico ao anterior, com relação à linha 3 de ambos;
4a5 Acrescentar (a) após a linha 4 de arqA, a linha 5 de arqB

É importante observar que, quando diff está descrevendo essas diferenças, está dizendo como alterar o primeiro arquivo para fazê-lo corresponder ao segundo arquivo. Para constatar, vamos alterar a ordem dos arquivos:

$ diff arqB arqA
1c1
< Tomar vinho à noite me ajuda a dormir
—-
> Tomar leite à noite me ajuda a dormir
3c3
< Gosto também de ir à praia,
—-
> Gosto também de ir ao cinema,
5d4
< Afinal é melhor só que mal acompanhado.

Repare que a ordem das setas (< >) se inverteram e a última linha agora está assim:

5d4 – Deletar (d) a linha 5 de arqB equiparando até a linha 4 de arqA

Por esses dois exemplos que vimos, deduzimos que:

Letra Corresponde
a Incluir linha após (append)
c Alterar linha (change)
d Remover linha (delete)

Uma outra forma de usar o diff que gera uma saída parecida com a dos comandos sdiff e comm (acho este último melhor) é com a opção -y. Veja:

$ diff -y Num1 Num2
1	<
2		2
3		3
	>	4

Com a opção -y, o diff cria uma tabela com os arquivos e insere setas mostrando o que deve ser incluído ou excluído do primeiro arquivo. Neste exemplo, deve-se excluir (<) a linha que tem o número 1 e após a linha que tem o 3, deve-se inserir (>) uma linha com 4.

Podemos também comparar binários:

$ diff Comp1.odp Comp2.odp
Os arquivos binários ``Comp1.odp`` e ``Comp2.odp`` são diferentes

Para comparar aquivos compactados, podemos usar o zdiff que usa as mesmas regras do diff nesse tipo de arquivo.

Para comparar diretórios:

$ touch temp1/{arqA,arqB} temp2/{arqB,arqC}
$ diff temp1 temp2
Somente em temp1: arqA
Somente em temp2: arqC

Algumas vezes dois arquivos diferem somente nos espaços em branco, podemos evitar que isso que esta diferença seja acusada com o uso da opção -b.

$ diff <(echo ' ') <(echo '      ') &> /dev/null &&
    echo Iguais || echo Diferentes
Diferentes
$ diff -b <(echo ' ') <(echo '      ') &> /dev/null &&
    echo Iguais || echo Diferentes
Iguais

Esse não é o único programa para comparações de arquivos, mas é o mais usado. Existem outros, mas em seguida pretendo mostrar também os comandos cmp (que é mais apropriado para uso em scripts) e comm. Então até lá.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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