Je ne suis pas vraiment un gars unix, je vais donc simplement poser la question suivante:
J'ai un problème suivant - deux dossiers avec beaucoup de sous-dossiers. J'ai besoin de les différencier.
J'ai essayé ceci:
diff -drupN vanila_kernel_3.0.8 my_kernel_3.0.8 > kernel.patch
et cela aboutit à un fichier de 85 Mo ... et pas vraiment ce que je veux.
Je veux que le résultat du diff soit de nombreux correctifs plus petits, idéalement un pour chaque fichier modifié avec le contenu de la modification. Cela signifie que j’ai changé la façon dont j’utilise diff, et j’ai besoin de le mettre dans une sorte de boucle ... Donc j’ai essayé d’exécuter ce petit script
for file in original_308/*.*; do
diff -dupN "$file" "my_308/${file##*/}" > "$file".patch
done
Mais ça ne marche pas: /
Idéalement, je veux avoir un fichier .patch pour chaque modification, mais avoir des correctifs pour les fichiers qui ont été modifiés dans l’original ferait très bien (je pourrais filtrer les fichiers nouvellement ajoutés et simplement les copier).
Quelqu'un peut-il me fournir un moyen décent de le faire s'il vous plaît?
MODIFIER:
Voici quelque chose choroba m'a demandé de poster
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
Donc, oui, c'est la sortie appropriée même si gedit/geany ne peut pas l'ouvrir. UltraEdit fait ...
Vous pouvez utiliser le format original qui crée l’énorme fichier diff que vous pouvez ensuite scinder en petits fichiers. Vous pourriez être intéressé par csplit
pour le fractionnement, ou vous pouvez utiliser un langage de script tel que Perl:
Perl -ne 'if(/^diff -drupN (.*) (.*)/) {
my $f = $1;
$f =~ s{/}{_}g;
open $FH, ">", "$f.patch" or die $!;
} else {
print {$FH} $_;
}' kernel.patch
Si vous avez besoin de la ligne diff
dans chaque fichier, ajoutez le print
après le open
.
J'ai écrit un petit script Perl pour patcher les fichiers. Ce script est très basique, il parcourt les répertoires de manière récursive, récupère le fichier et crée un diff.
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`;
}
Exemple d'utilisation: $ ./testpatch.pl original_308/ tmp/ tmp1
J'ai créé des exemples de fichiers (header.cpp, head1.S, head.S)
Après avoir exécuté le script, les diffs ont été créés dans un nouveau répertoire "tmp1"
Sortie:
J'espère que cela t'aides.