Я не очень разбираюсь в 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 делает ...
Можно использовать исходный формат, который создает огромный различный файл, который можно впоследствии разделить на маленькие файлы. Вы могли бы интересоваться 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, голова. S)
После запущения скрипта diffs были созданы в новом dir "tmp1"
Вывод:
Надеюсь, это поможет.