gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:33:41 24 4
gpt4 key购买 nike

首先,我尝试在 askubuntu 上询问同样的问题,但我没有走得太远...... https://askubuntu.com/questions/186114/how-to-diff-two-folders-to-multiple-patch-files/186121#comment231985_186121

所以,我会复制/粘贴到这里,希望 SO 能给我一个可行的解决方案...

我不是 unix 专家,所以我会继续问:

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

我试过这个:

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

这会产生一个 185mb 的文件……这并不是我想要的。

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

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

但它不起作用:/

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

请问有人能给我提供一个合适的方法吗?

更新:我知道这些文件夹之间有 231 个更改的文件和 4546 个新添加的文件......我只对生成这 231 个补丁感兴趣。我什至有一个包含这 231 个文件名的文件,因此也可以在脚本中使用。

我用它来生成变更日志

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

这只是打印更改的文件名,后面是“only in my_308”文件...231 个文件位于该文件的顶部(前 231 行)

所以让我们说清楚 - 我想要源文件的 .patch 文件。如果补丁可以以 patches//file_name.c.patch 结尾,那就太好了……

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

最佳答案

是这样的吗?

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 的形式为您提供已更改的文件列表。将其传递给 while ...read.. 为每个更改的文件运行循环体,文件名存储为 f1 和 f2。

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

这会去掉文件名的尾部(通过删除基本目录),这样我们就可以确定输出补丁文件的正确路径。之后,只需确保输出目录存在并在 f1f2 上写出差异结果即可。

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

关于linux - 如何将两个文件夹区分为多个补丁文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com