私は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は...
巨大な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
を追加します。
ファイルにパッチを適用する小さな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)
スクリプトを実行した後、新しいディレクトリ「tmp1」に差分が作成されました
出力:
お役に立てれば。