linux中比较两个压缩包,把新文件打成patch包

anonymous_vhacker
anonymous_vhacker
发布于 2023-02-23 / 28 阅读
0
0

linux中比较两个压缩包,把新文件打成patch包

所需材料:

  • linux操作环境

  • 两个需比较的压缩包file1.tar.gz和file2.tar.gz

步骤:

  1. 把两个压缩包file1.tar.gz和file2.tar.gz放到同一目录中,并cd到该目录

  2. 新建两个临时目录用于存放解压出来的文件。(有的方法直接上来就用tar zxvf file1.tar.gz解压,这样不好,万一压缩包里一堆文件没放目录中,解压出来全散在外面)

    新建patch目录用来存放新文件。

    mkdir tmpdir1 tmpdir2 patch
  3. 解压到临时目录

    tar zxvf file1.tar.gz -C tmpdir1
    tar zxvf file2.tar.gz -C tmpdir2
  4. 比较文件

    diff -qr tmpdir1 tmpdir2 >> diff.txt
  5. 拷贝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
  6. 打包patch包并删除临时文件

    cd patch/tmpdir2/
    tar zcvf ../patch.tar.gz *
    cd ..
    rm -rf tmpdir2/
    cd ..
    rm -rf tmpdir1 tmpdir2
  1. 得到的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!!!!


评论