Como diferenciar duas pastas para vários arquivos de correção

5

Eu não sou muito cara de unix, então vou em frente e pergunto:

Eu tenho um problema a seguir: duas pastas com várias subpastas. Eu preciso diferenciá-los.

Eu tentei isso:

diff -drupN vanila_kernel_3.0.8 my_kernel_3.0.8 > kernel.patch

e isso resulta em um arquivo de 85MB ... e não exatamente o que eu quero.

Eu quero que o resultado do diff seja muito pequeno, idealmente para cada arquivo alterado com o conteúdo da alteração. Isso significa que eu tenho que mudar o jeito que eu uso diff, e eu preciso colocá-lo em algum tipo de loop ... Então, eu tentei executar este pequeno script

for file in original_308/*.*; do
    diff -dupN "$file" "my_308/${file##*/}" > "$file".patch
done

Mas isso não funciona: /

Idealmente, eu quero ter um arquivo .patch para cada alteração, mas ter patches para arquivos que foram alterados no original seria bom (já que eu poderia filtrar os arquivos recém-adicionados e apenas copiá-los)

Alguém pode me fornecer uma maneira decente de fazer isso, por favor?

EDITAR:

Aqui está algo que a choroba me pediu para postar

diff -Naur -x '*.o' -x '*.cmd' -x '*.d' original_308/arch/arm/boot/compressed/head.S my_308/arch/arm/boot/compressed/head.S
--- original_308/arch/arm/boot/compressed/head.S    2011-10-25 07:11:12.000000000 +0200
+++ my_308/arch/arm/boot/compressed/head.S  2012-07-04 03:57:25.000000000 +0200
@@ -656,6 +656,8 @@
@       b   __arm6_mmu_cache_off
@       b   __armv3_mmu_cache_flush

Então, sim, é a saída correta mesmo que o gedit / geany não possa abri-la. UltraEdit faz ...

    
por Shark 10.09.2012 / 12:37

2 respostas

1

Você pode usar o formato original que cria o arquivo diff enorme que você pode subseqüentemente dividir em arquivos pequenos. Você pode estar interessado em csplit para a divisão ou pode usar uma linguagem de script como Perl:

perl -ne 'if(/^diff -drupN (.*) (.*)/) {
              my $f = $1;
              $f =~ s{/}{_}g;
              open $FH, ">", "$f.patch" or die $!;
          } else {
              print {$FH} $_;
          }' kernel.patch

Se você precisar da linha diff em cada arquivo, adicione o print após o open .

    
por choroba 10.09.2012 / 13:20
0

Eu escrevi um pequeno script Perl para corrigir os arquivos. Este script é muito básico, que percorre os diretórios recursivamente e busca o arquivo e cria um diff.

Usage: script_name.pl <source_dir> <dest_dir> <dir_2_create_diffs>

testpatch.pl

#!/usr/bin/perl

use File::Find;
my $source = $ARGV[0];
my $dest = $ARGV[1];
my $pathdir = $ARGV[2];

unless (defined $ARGV[2]) { print "Usage: $0 <source> <dest> <patch_directory>\n"; exit 0; }
my @alldir;
find sub {
     return if -d;
     push @alldir, $File::Find::name;
}, "$source";
for my $path ( @alldir) {
     my @tmp = split ("/",$path); my $rmt_dir = shift(@tmp); 
     my $fpath = join("/",@tmp);  my $fn = $tmp[-1];
     pop(@tmp); my $strp_path = join("/",@tmp);
     'mkdir -p $pathdir/$strp_path' unless( -d "$pathdir/$strp_path");
     'diff -dupN $path $dest$fpath > $pathdir/$strp_path/$fn.patch';
}

Uso da amostra: $ ./testpatch.pl original_308/ tmp/ tmp1

Eu criei arquivos de amostra (header.cpp, head1.S, head.S)

  • original_308 / arch / arm / boot: header.cpp
  • original_308 / arch / arm / boot / compactado: head1.S head.S
  • tmp / arch / arm / boot: header.cpp
  • tmp / arch / arm / boot / compactado: head1.S cabeça.S

Depois de executar o script, os diffs foram criados em um novo diretório "tmp1"

Saída:

  • tmp1 / arch / arm / boot: header.cpp.patch
  • tmp1 / arch / arm / boot / compactado: head1.S.patch head.S.patch

Espero que isso ajude.

    
por devav2 10.09.2012 / 21:00