web-dev-qa-db-ja.com

2つのフォルダーを複数のパッチファイルに比較する方法

私はunixの人ではないので、先に進んで質問します。

次の問題があります-サブフォルダーがたくさんある2つのフォルダー。それらを比較する必要があります。

私はこれを試しました:

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

そして、それは85MBのファイルになります...そして本当に私が望むものではありません。

差分の結果は、多くの小さなパッチ、理想的には変更の内容を含む変更されたファイルごとに1つにすることです。つまり、diffの使用方法を変更せずに、なんらかのループに入れる必要があるということです。この小さなスクリプトを実行してみました。

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

しかし、それは動作しません:/

理想的には、すべての変更に対して.patchファイルが必要ですが、オリジナルに変更されたファイルのパッチを作成するだけで十分です(新しく追加したファイルをフィルターしてコピーするだけです)。

誰かがこれを行うためのまともな方法を私に提供できますか?

編集:

チョロバに投稿を頼まれたものがあります

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
Shark

巨大なdiffファイルを作成する元の形式を使用できます。これは、後で小さなファイルに分割できます。分割に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
choroba

ファイルにパッチを適用する小さな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、head.S)

  • original_308/Arch/arm/boot:header.cpp
  • original_308/Arch/arm/boot/compressed:head1.S head.S
  • tmp/Arch/arm/boot:header.cpp
  • tmp/Arch/arm/boot/compressed:head1.S head.S

スクリプトを実行した後、新しいディレクトリ「tmp1」に差分が作成されました

出力:

  • tmp1/Arch/arm/boot:header.cpp.patch
  • tmp1/Arch/arm/boot/compressed:head1.S.patch head.S.patch

お役に立てれば。

0
devav2