Как разнести две папки в несколько файлов патчей

Я не очень разбираюсь в Unix, поэтому я просто хочу спросить:

У меня следующая проблема - две папки с множеством подпапок. Мне нужно их различить.

Я попробовал это:

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

, и в результате получается файл размером 85 Мб ... и не совсем то, что я хочу.

Я хочу, чтобы результатом diff было множество небольших патчей, в идеале по одному на каждый измененный файл с содержимым изменения. Это означает, что я должен изменить способ использования diff, и мне нужно поместить его в какой-то цикл ... Итак, я попытался запустить этот маленький скрипт

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

Но он не работает: /

В идеале я хочу иметь файл .patch для каждого изменения, но наличие патчей для файлов, которые изменились в оригинале, подойдет (так как я могу отфильтровать вновь добавленные файлы и просто скопировать их) [ 119]

Может кто-нибудь предоставить мне достойный способ сделать это, пожалуйста?

РЕДАКТИРОВАТЬ:

Вот что-то Чороба попросил меня опубликовать

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

Так что да , это правильный вывод, даже если gedit / geany не может его открыть. UltraEdit делает ...

5
задан 10 September 2012 в 18:46

2 ответа

Можно использовать исходный формат, который создает огромный различный файл, который можно впоследствии разделить на маленькие файлы. Вы могли бы интересоваться csplit для разделения, или можно использовать язык сценариев как Perl:

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

Если Вам нужно diff строка в каждом файле, добавляют print после open.

1
ответ дан 10 September 2012 в 18:46

Я имею, записал маленький сценарий Perl для исправления файлов. Этот сценарий является очень простым, который проходит каталоги рекурсивно, и выберите файл, и создает различное.

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`;
}

Демонстрационное использование: $ ./testpatch.pl original_308/ tmp/ tmp1

Я создал файлы примера (header.cpp, head1. S, голова. S)

  • original_308/arch/arm/boot:header.cpp
  • original_308/arch/arm/boot/compressed:head1. S голова. S
  • tmp/arch/arm/boot:header.cpp
  • tmp/arch/arm/boot/compressed:head1. S голова. S

После запущения скрипта diffs были созданы в новом dir "tmp1"

Вывод:

  • tmp1/arch/arm/boot:header.cpp.patch
  • tmp1/arch/arm/boot/compressed: head1. Голова S.patch. S.patch

Надеюсь, это поможет.

0
ответ дан 10 September 2012 в 18:46

Другие вопросы по тегам:

Похожие вопросы: