如何将两个文件夹区分为多个补丁文件

Sha*_*ark 6 command-line bash scripts diff

我不是一个 unix 人,所以我会继续问:

我有以下问题 - 两个文件夹有很多子文件夹。我需要区分它们。

我试过这个:

diff -drupN vanila_kernel_3.0.8 my_kernel_3.0.8 > kernel.patch
Run Code Online (Sandbox Code Playgroud)

这导致了一个 85mb 的文件......并不是我想要的。

我希望 diff 的结果是许多较小的补丁,理想情况下,每个包含更改内容的已更改文件都有一个补丁。这意味着我没有改变我使用 diff 的方式,我需要把它放在某种循环中......所以我尝试运行这个小脚本

for file in original_308/*.*; do
    diff -dupN "$file" "my_308/${file##*/}" > "$file".patch
done
Run Code Online (Sandbox Code Playgroud)

但它不起作用:/

理想情况下,我希望每个更改都有一个 .patch 文件,但是为原始更改的文件提供补丁就可以了(因为我可以过滤新添加的文件并复制它们)

有人可以为我提供一个体面的方法来做到这一点吗?

编辑:

这是 choroba 要求我发布的内容

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
Run Code Online (Sandbox Code Playgroud)

所以是的,即使 gedit/geany 无法打开它,它也是正确的输出。UltraEdit 确实...

cho*_*oba 1

您可以使用创建巨大差异文件的原始格式,随后可以将其拆分为小文件。csplit您可能对拆分感兴趣,或者您可以使用 Perl 等脚本语言:

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

如果您需要diff每个文件中的行,请printopen.