diff e patch - Um guia sem hora pra acabar

Introdução rápida aos programas diff e patch. A primeira parte de um guia que eu pretendo fazer com várias partes, sem data nem hora pra acabar, sem número definido de partes.

[ Hits: 21.892 ]

Por: Josiel A. Santos em 27/01/2014 | Blog: http://blog.josielsantos.esy.es/


diff / patch



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.

Página anterior     Próxima página

Páginas do artigo
   1. Resumo
   2. diff / patch
   3. Conclusão
Outros artigos deste autor

Testes unitários em Java com JUnit

Leitura recomendada

Entretenimento no Linux

Sabayon Linux - Novos Repositórios da Comunidade

GNU/Linux - Benefícios na Área Administrativa

Debian Constantly Usable Testing (CUT)

Hierarquia do Sistema de Arquivos GNU/Linux

  
Comentários
[1] Comentário enviado por itamarnet em 27/01/2014 - 08:43h

Legal seu artigo, mas me lembra um tutorial em vídeo feito pelo Aurelio, confere nesse link, quem sabe lhe dá mais algumas idéias:

http://aurelio.net/blog/2012/05/02/video-aula-como-aplicar-um-patch-diff/

Parabéns meu amigo

[2] Comentário enviado por removido em 28/01/2014 - 23:03h

Gostei!

[3] Comentário enviado por removido em 19/02/2014 - 16:44h

Muito bom!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts