Executando um comando para cada linha de um arquivo com bash

Linux, Programação 1 Comment

Hoje precisei gerar o diff do svn de alguns arquivos cujo nomes estavam armazenados dentro de um arquivo.

Para gerar o diff no svn de cada um desses arquivos basta fazer o seguinte:

cat arquivos.txt | xargs -I {} svn diff -r 39177:HEAD https://svn/projeto{} > diff.txt

Onde o arquivo arquivos.txt contém o nome dos arquivos em cada linha, e o diff.txt será o diff de todos esses arquivos.

O Guia de Dez Minutos de diff e patch

Programação 3 Comments

O seguinte texto foi traduzido e adaptado de:

http://jungels.net/articles/diff-patch-ten-minutes.html

Primeira situação: você está tentando compilar um pacote à partir do código fonte e descobre que alguém já o modificou para compilar na sua plataforma. Ele disponibilizou o seu trabalho como um “patch”, mas você não tem certeza de como utilizá-lo. Para utilizá-lo você deve aplicar o patch no código fonte original com uma ferramenta de linha de comando chamada patch.

Segunda situação: você fez o download do código fonte de um pacote open source e depois de algumas alterações você conseguiu compilá-lo na sua plataforma. Você gostaria de disponibilizar o seu trabalho para outros programadores, ou para os autores do pacote, sem distribuir todo o pacote modificado. Nesta situação você deve criar um patch, e a ferramenta necessária é a diff.

Este é um guia rápido para gerar ou utilizar patches que irá ajudá-lo nestas situações, mostrando como usar as ferramentas nas situações mais comuns.

Aplicando patches com patch

Para aplicar um patch em um arquivo, vá ao diretório onde o arquivo está e chame o comando patch:

patch < foo.patch

O comando acima assume que o patch está distribuído no formato unificado, que identifica o arquivo no qual patch deve ser aplicado. Se não estiver no formato unificado, você pode especificar o arquivo na linha de comando:

patch foo.txt < bar.patch

A aplicação de patches em um diretório (caso mais comum) é similar, mas você deve setar um "p level". Isto significa que dentro dos arquivos de patches, os arquivos são identificados por caminhos que possam ser diferentes de quando o patch foi criado. O "p level" faz com que o patch ignore partes do caminho do arquivo para que seja possível identificar os arquivos corretamente. Geralmente um "p level" de 1 irá funcionar, então utilize:

patch -p1 < baz.patch

Você deve mudar para o diretório raiz do código fonte antes de executar este comando. Se o "p level" utilizado não identificar corretamente os arquivos, procure nomes de arquivos no patch. Se você ver um nome como:

/users/stephen/package/src/net/http.c

E você estiver trabalhando em um diretório que contenha net/http.c, use:

patch -p5 < baz.patch

Em geral, conte quantos separadores de diretório (/) você precisa remover à partir do começo do caminho, até que o restante seja um caminho que exista no diretório atual. O valor encontrado será o "p level" que deve ser utilizado.

Para remover um patch, use a flag -R:

patch -p5 -R < baz.patch

Criando patches com diff

Utilizar a ferramenta diff é simples quer você esteja trabalhando com um arquivo ou com diretórios. Para criar um patch à partir de um arquivo, use:

diff -u original.c new.c > original.patch

Para criar um patch de um diretório inteiro, faça uma cópia do diretório:

cp -R original new

Faça as alterações necessárias no diretório new/. E então cria o patch com o comando:

diff -rupN original/ new/ > original.patch

Isto é tudo o que você precisa saber para começar a utilizar as ferramentas diff e patch. Para mais informações utilize:

man diff

man patch

Traduções

Inglês: http://jungels.net/articles/diff-patch-ten-minutes.html

Espanhol: http://www.rat.uclatux.org.ve/2009/05/guia-de-10-minutos-de-diff-y-patch/

Francês: http://fredgnix.wordpress.com/2012/02/15/diff-et-patch-en-dix-minutes/