微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

首先,我试着在askubuntu上询问同样的问题,但我并没有在这方面做得太多。https://askubuntu.com/questions/186114/how-to-diff-two-folders-to-multiple-patch-files/ 186121个#comment231985_186121

所以,我会复制/粘贴希望这给我一个工作的解决scheme…

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

我有一个以下的问题 – 两个文件夹与大量的子文件夹。 我需要区分他们。

Windows批处理脚本中的FOR命令数量限制

batch file从文本文件中总结数字,并将总值写入文本文件

Bash:单引号中的variables

Windows命令提示符不工作从Python

在特定的terminal中通过Perl运行一个shell命令

我试过这个:

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

这导致了一个185MB文件…而不是真正的我想要的。

我希望差异的结果是很多较小的补丁,理想情况下每个更改的文件与更改的内容之一。 这意味着我有改变我使用差异的方式,我需要把它放在某种循环…所以我试着运行这个小脚本

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

但它不起作用:/

理想情况下,我想为每个更改都有一个.patch文件,但是对于在原始文件中更改的文件的修补程序可以做得很好(因为我可以过滤新添加文件并将其复制)

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

更新:我知道这些文件夹和4546新增文件之间有231个改变的文件…我只是有兴趣在生成这些231补丁。 我甚至有一个文件包含这些231文件名,以便可以在脚本中使用。

我用这个来生成更新日志

diff -qdr -x *.o -x *.cmd -x *.d original_308 my_308 | sed "s/^.* and (.*) differ/1/" | sort > changes.txt

而且只打印改变的文件名,由“仅在my_308”文件中… … 231个文件位于该文件的顶部(前231行)

所以让我们清楚 – 我想要.patch文件的源文件。 如果补丁最终可能以补丁// file_name.c.patch结尾,那真是太好了…

如果你给我PERL脚本,请告诉我如何最好地使用他们,因为我不明白,垃圾。 请不要让我失望 我需要把这个东西移植,testing和运行,我浪费时间在Unix命令和无形脚本ffs上。

Ack有时不会显示行号并丢失着色

使用batch file为每个关键字实例创build一个换行符

与find.exe错误

隐藏参数从PS

使用批处理脚本查找正确的父文件

你可以抓取<Learning Perl>书并在一周内学习,Perl非常酷,请不要把它称为垃圾。 这里是生成补丁的shell脚本

find ./original_308 -type f | while read file do nfile="./my_308/${file#*original_308/}" if [ -f $nfile ]; then patchfile="./patch/${file#*original_308/}.patch" mkdir -p `dirname $patchfile` echo "checking $file $nfile" diff -dupN "$file" "$nfile" > "$patchfile" && rm "$patchfile" fi done

diff xxx> patch && rm补丁只会删除空的补丁文件

这应该在kernel.patch文件上工作,即使您给diff的选项与上面显示的选项不同:

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

如果您的文件名包含空格,这可能会中断。

像这样的东西?

DIR1="vanila_kernel_3.0.8" DIR2="my_kernel_3.0.8" OUTDIR="patches" SUFFIX=".patch" while IFS="," read f1 f2; do filename=${f1#$DIR1} # remove base dir name outfile="${OUTDIR}/${filename}${SUFFIX}" mkdir -p $(dirname $outfile) # make sure output directory exist diff -dupN "$f1" "$f2" > "$outfile" done < <(diff -qdr $DIR1 $DIR2 | awk '/differ$/{print $2","$4}')

快速解释:

diff -qdr $DIR1 $DIR2 | awk '/differ$/{print $2","$4}'

这应该会给你一个以source_file,dest_file形式source_file,dest_file的文件列表。 将它传递给while ...read..为每个更改的文件运行循环体,文件名存储为f1和f2。

filename=${f1#$DIR1} # remove base dir name

这剥去了文件名的后面部分(通过删除基本目录),所以我们可以确定输出补丁文件的正确路径。 之后,只需要确保输出目录存在,并将差异结果写在f1和f2 。

围绕所有文件名的引号确保我们可以处理文件名中的空格。

感谢大家的贡献…这是最终的结果

#!/bin/bash FOLDER_OLD="original" FOLDER_NEW="changed" FOLDER_PATCHES="./fresh_patches" echo "Generating changelog for $FOLDER_OLD --> $FOLDER_NEW" diff -qdr ${FOLDER_OLD} ${FOLDER_NEW} | sed "s/^.* and (.*) differ/1/" | sort > newchanges.txt mkdir -p ${FOLDER_PATCHES} for newfile in `find $FOLDER_NEW -type f` do sufix=${newfile#${FOLDER_NEW}/} oldfile="${FOLDER_OLD}/${sufix}" if [ -f $oldfile ]; then patchfile="${FOLDER_PATCHES}/`echo $sufix |sed 's///_/g'`.patch" if [ "`diff $oldfile $newfile`" != "" ]; then echo "Make patch ${patchfile}" diff -dupN "$oldfile" "$newfile" > "$patchfile" fi else patchfile="${FOLDER_PATCHES}/ADDONS/${newfile#$FOLDER_NEW}" echo "copy $newfile --> $patchfile" mkdir -p "`dirname ${patchfile}`" cp $newfile $patchfile fi done

脚本首先生成一个只有新项目/文件夹才具有唯一性的文件文件列表; 那么它会为每个文件生成一个补丁文件,并将新添加文件复制到ADDONS文件夹(对于新项目是唯一的)

项目清单

$ diff -rauB old_dir new_dir > patchfile_name $ patch --dry-run -p1 -i patchfile_name $ patch -p1 -i patchfile_name

这会在两个目录之间创建一个补丁。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐