所需材料:
linux操作环境
两个需比较的压缩包file1.tar.gz和file2.tar.gz
步骤:
把两个压缩包file1.tar.gz和file2.tar.gz放到同一目录中,并cd到该目录
新建两个临时目录用于存放解压出来的文件。(有的方法直接上来就用tar zxvf file1.tar.gz解压,这样不好,万一压缩包里一堆文件没放目录中,解压出来全散在外面)
新建patch目录用来存放新文件。
mkdir tmpdir1 tmpdir2 patch
解压到临时目录
tar zxvf file1.tar.gz -C tmpdir1 tar zxvf file2.tar.gz -C tmpdir2
比较文件
diff -qr tmpdir1 tmpdir2 >> diff.txt
拷贝file2.tar.gz相对于file1.tar.gz新增的文件。
拷贝file2.tar.gz相对于file1.tar.gz哈希值变化的文件
cat diff.txt | grep "^Only in tmpdir2" | awk '{gsub(/:$/,"/",$(NF-1)); print $(NF-1)$NF}' | xargs -i cp --parents {} patch cat diff.txt | awk '$1=="Files" && $5=="differ" {print $4}' | xargs -i cp --parents {} patch
打包patch包并删除临时文件
cd patch/tmpdir2/ tar zcvf ../patch.tar.gz * cd .. rm -rf tmpdir2/ cd .. rm -rf tmpdir1 tmpdir2
得到的patch目录中的patch.tar.gz就是file2.tar.gz相对于file1.tar.gz新增和变化的文件的补丁包。
脚本:
把上述步骤写成一个shell脚本,并用参数传进file1.tar.gz和file2.tar.gz文件名。脚本如下:
#!/bin/bash
FILE1=$1
FILE2=$2
if [[ ! -f "$FILE1" || ! -f "$FILE2" ]]; then
echo "Files not exist!"
exit 1
fi
rm -rf tmpdir1 tmpdir2 patch diff.txt
mkdir tmpdir1 tmpdir2 patch
echo -e "[ Unpacking...\t] Unpack '$FILE1'"
tar zxf $FILE1 -C tmpdir1
echo -e "[ Unpacking...\t] Unpack '$FILE2'"
tar zxf $FILE2 -C tmpdir2
echo -e "[ Comparing...\t] Compare '$FILE2' to '$FILE1'"
diff -qr tmpdir1 tmpdir2 >> diff.txt
echo -e "[ Copying...\t] Copy files with differents."
cat diff.txt | grep "^Only in tmpdir2" | awk '{gsub(/:$/,"/",$(NF-1)); print $(NF-1)$NF}' | xargs -i cp --parents {} patch
cat diff.txt | awk '$1=="Files" && $5=="differ" {print $4}' | xargs -i cp --parents {} patch
echo -e "[ Repacking...\t] Repack patch files."
cd patch/tmpdir2/
tar zcf ../patch.tar.gz *
echo -e "[ Removing...\t] Remove temp files."
cd ..
rm -rf tmpdir2/
cd ..
rm -rf tmpdir1 tmpdir2 diff.txt
echo -e "[ Done!\t\t] Generate file 'patch/patch.tar.gz'."
保存上述脚本到patcher.sh,并把脚本和两个要比较的压缩包放在同一目录中。
执行chmod 777 ./patcher.sh
赋予权限。
执行./patcher.sh file1.tar.gz file2.tar.gz
。
产生的patch包在./patch/patch.tar.gz。
注:
以上方法是我问了ChatGPT,得到了帮助,并加以自己的修改,从而实现的。
不得不说,ChatGPT yyds!!!!