首先,我试着在askubuntu上询问同样的问题,但我并没有在这方面做得太多。https://askubuntu.com/questions/186114/how-to-diff-two-folders-to-multiple-patch-files/ 186121个#comment231985_186121
我不是一个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
我希望差异的结果是很多较小的补丁,理想情况下每个更改的文件与更改的内容之一。 这意味着我有改变我使用差异的方式,我需要把它放在某种循环…所以我试着运行这个小脚本
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] 举报,一经查实,本站将立刻删除。