diff
diff é uma ferramenta de linha de comando que pode ser utilizada para comparar arquivos e diretórios. Ele pode comparar somente um arquivo, assim como pode comparar dois diretórios inteiros, com zilhões de arquivos para você, salvando essas diferenças em um formato entendido pelo programa
patch, que pode ser utilizado para atualizar o arquivo/diretório original com as modificações identificadas pelo diff.
O diff é distribuído com as distribuições GNU/Linux e não creio que esteja faltando em sua distribuição, seja ela qual for. Também está presente nas ferramentas
Cygwin e
MinGW.
O programa apresenta uma variedade enorme de opções, para que você possa ter o máximo de precisão possível na identificação das diferenças.
Modo de usar:
diff [opções] <arquivos | diretórios>
Algumas das opções (básicas), são:
- -i, --ignore-case :: ignora maiúsculas e minúsculas no conteúdo dos arquivos.
- --ignore-file-name-case :: ignora maiúsculas e minúsculas nos nomes dos arquivos.
- --no-ignore-file-name-case :: considera maiúsculas e minúsculas nos nomes dos arquivos.
- -b, --ignore-space-change :: ignora mudanças no número de espaços em branco.
- -w, --ignore-all-space :: ignora espaços em branco.
- -B, --ignore-blank-lines :: ignora mudanças quando as linhas estão em branco.
- --binary :: lê e escreve dados em modo binário.
- -a, --text :: trata todos os arquivos como texto.
- -q, --brief :: mostra apenas as diferenças nos arquivos.
- --suppress-common-lines :: não mostra linhas em comum.
- -r, --recursive :: compara recursivamente os subdiretórios.
Essas não são nem metade de todas as opções do programa, só que nesse primeiro texto, é o que eu tenho para mostrar. O que for aprendendo, virá nas próximas partes, e claro, não fique parado! Não fique preso somente às informações dadas aqui. Procure outras fontes, leia as páginas de manual e nunca se prenda à somente um artigo. Vamos continuar!
Identificando diferenças
Vamos agora começar pelo começo, a parte de criação de um patch. E para criarmos um patch, devemos ter arquivos, e vamos criar dois textos. Não vamos começar com códigos, vamos começar com textos simples.
Criei dois arquivos:
a.txt e
b.txt.
Seus conteúdos super-produtivos, são:
a.txt:
Oi, eu sou o Josiel e acho muito legal criar patches.
b.txt:
Olá! Meu nome é Josiel e acho maneiro criar patches.
Agora, o que devemos fazer, é identificar suas diferenças com o comando diff:
diff a.txt b.txt
A saída produzida é:
1c1
< Oi, eu sou o Josiel e acho muito legal criar patches.
---
> Olá! Meu nome é Josiel e acho maneiro criar patches.
Dissecando a saída
O programa diff te mostra a saída em vários formatos, o programa patch entende todos eles. Este é o formato normal, e é ele que irei explicar agora.
Na primeira linha, temos:
1c1
Esta linha diz o seguinte ao programa patch: O conteúdo que está na linha 1 do arquivo original (a.txt), deve ser substituído (c) pelo que está na linha 1 do outro arquivo (b.txt).
A sintaxe dessa linha, pode ser:
<linha(s)><comando><linha(s)>
Podem ser especificados intervalos de linhas, utilizando a vírgula (,):
"1,3": Linha 1 à linha 3.
Os comandos, são:
- a :: adiciona o conteúdo da linha à direita na linha à esquerda.
- c :: substitui o conteúdo da linha à esquerda pelo conteúdo da linha à direita.
- d :: deleta o conteúdo da linha à esquerda.
Depois temos:
< Oi, eu sou o Josiel e acho muito legal criar patches.
---
> Olá! Meu nome é Josiel e acho maneiro criar patches.
O sinal
<, indica que o conteúdo a seguir está no arquivo original (a.txt). Os três hífens ("---") indicam o fim da linha a ser substituída e o início da substituta. Na próxima linha, iniciamos com o sinal de
>, indica que essa é a substituta.
Os sinais
< e
> não são usados juntos em todos os comandos.
Veja:
- a :: apenas o sinal de > estará presente, pois a linha a ser adicionada está no arquivo 2 (b.txt).
- c :: ambos os sinais (< e >) devem ser usados, pois o < indica a linha original, e > indica a substituta.
- d :: apenas o sinal < é utilizado, ele indica a linha a ser deletada.
Criando e aplicando um patch
Agora que sabemos como identificar as diferenças, está na hora de criarmos e aplicarmos as mudanças presentes no arquivo
b.txt no arquivo
a.txt.
Antes de mais nada, devemos utilizar o programa diff novamente, agora salvando o resultado num arquivo, e não apresentando-o na tela:
diff a.txt b.txt > c.patch
Dessa forma, o mesmo conteúdo apresentado acima, foi salvo no arquivo
c.patch. Agora, iremos usar o programa patch para atualizar o nosso arquivo
a.txt.
Veja:
patch a.txt c.patch
A sintaxe básica do programa patch, é:
patch <arquivo a ser atualizado> <arquivo que contém as atualizações>
Agora confira o conteúdo do arquivo
a.txt e veja como foi simples fazermos nossas alterações, sem
Ctrl+c /
Ctrl+v, de uma forma segura.