|
@@ -1,35 +1,55 @@
|
|
|
-#!/bin/bash
|
|
|
+#!/bin/sh
|
|
|
+# 用法:./diff_zip_sh.sh zip1.zip zip2.zip diff.zip
|
|
|
|
|
|
-# 检查参数
|
|
|
-if [ "$#" -ne 3 ]; then
|
|
|
- echo "用法: $0 <dir1> <dir2> <output.tar.gz>"
|
|
|
+usage() {
|
|
|
+ echo "用法: $0 <zip1> <zip2> <diff.zip>"
|
|
|
exit 1
|
|
|
-fi
|
|
|
-
|
|
|
-dir1="$1"
|
|
|
-dir2="$2"
|
|
|
-output="$3"
|
|
|
-
|
|
|
-# 确保目录存在
|
|
|
-if [ ! -d "$dir1" ] || [ ! -d "$dir2" ]; then
|
|
|
- echo "错误:目录不存在"
|
|
|
- exit 1
|
|
|
-fi
|
|
|
-
|
|
|
-# 创建临时目录
|
|
|
-tmp_dir=$(mktemp -d)
|
|
|
-trap "rm -rf $tmp_dir" EXIT
|
|
|
-
|
|
|
-# 使用 rsync 找出 dir2 中新增或修改的文件
|
|
|
-rsync -av --compare-dest="$dir1" "$dir2"/ "$tmp_dir"/ > /dev/null
|
|
|
-
|
|
|
-# 如果没有差异,提示并退出
|
|
|
-if [ -z "$(ls -A "$tmp_dir")" ]; then
|
|
|
- echo "两个目录内容一致,无需打包。"
|
|
|
+}
|
|
|
+
|
|
|
+[ "$#" -eq 3 ] || usage
|
|
|
+
|
|
|
+zip1=$1
|
|
|
+zip2=$2
|
|
|
+diffzip=$3
|
|
|
+
|
|
|
+# 检查文件
|
|
|
+for f in "$zip1" "$zip2"; do
|
|
|
+ [ -f "$f" ] || { echo "文件不存在: $f"; exit 1; }
|
|
|
+done
|
|
|
+
|
|
|
+# 临时目录
|
|
|
+tmp=$(mktemp -d)
|
|
|
+trap 'rm -rf "$tmp"' EXIT
|
|
|
+
|
|
|
+tmp1=$tmp/1
|
|
|
+tmp2=$tmp/2
|
|
|
+tmp3=$tmp/3
|
|
|
+
|
|
|
+mkdir -p "$tmp1" "$tmp2" "$tmp3"
|
|
|
+
|
|
|
+# 解压
|
|
|
+unzip -q "$zip1" -d "$tmp1"
|
|
|
+unzip -q "$zip2" -d "$tmp2"
|
|
|
+
|
|
|
+# 递归对比
|
|
|
+find "$tmp2" -type f | while IFS= read -r f2; do
|
|
|
+ rel=${f2#$tmp2/}
|
|
|
+ f1=$tmp1/$rel
|
|
|
+ if [ -f "$f1" ] && cmp -s "$f1" "$f2"; then
|
|
|
+ continue # 内容相同,跳过
|
|
|
+ fi
|
|
|
+ dest=$tmp3/$rel
|
|
|
+ mkdir -p "$(dirname "$dest")"
|
|
|
+ cp "$f2" "$dest"
|
|
|
+done
|
|
|
+
|
|
|
+# 无差异
|
|
|
+[ -z "$(find "$tmp3" -type f 2>/dev/null)" ] && {
|
|
|
+ echo "两个 ZIP 内容完全一致,无需输出。"
|
|
|
exit 0
|
|
|
-fi
|
|
|
-
|
|
|
-# 打包压缩
|
|
|
-tar -czf "$output" -C "$tmp_dir" .
|
|
|
+}
|
|
|
|
|
|
-echo "✅ 差异文件已打包为:$output"
|
|
|
+# 打包
|
|
|
+(cd "$tmp3" && zip -qr ../out.zip .)
|
|
|
+mv "$tmp/out.zip" "$diffzip"
|
|
|
+echo "✅ 差异文件已保存到 $diffzip"
|