diff_pack.sh 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/bin/sh
  2. # 用法:./diff_zip_sh.sh zip1.zip zip2.zip diff.zip
  3. usage() {
  4. echo "用法: $0 <old.zip> <new.zip> <diff.zip>"
  5. exit 1
  6. }
  7. [ "$#" -eq 3 ] || usage
  8. zip1=$1
  9. zip2=$2
  10. diffzip=$3
  11. # 检查文件
  12. for f in "$zip1" "$zip2"; do
  13. [ -f "$f" ] || { echo "文件不存在: $f"; exit 1; }
  14. done
  15. # 临时目录
  16. tmp=$(mktemp -d)
  17. trap 'rm -rf "$tmp"' EXIT
  18. tmp1=$tmp/1
  19. tmp2=$tmp/2
  20. tmp3=$tmp/3
  21. mkdir -p "$tmp1" "$tmp2" "$tmp3"
  22. # 解压
  23. unzip -q "$zip1" -d "$tmp1"
  24. unzip -q "$zip2" -d "$tmp2"
  25. # 递归对比
  26. find "$tmp2" -type f | while IFS= read -r f2; do
  27. rel=${f2#$tmp2/}
  28. f1=$tmp1/$rel
  29. if [ -f "$f1" ] && cmp -s "$f1" "$f2"; then
  30. continue # 内容相同,跳过
  31. fi
  32. dest=$tmp3/$rel
  33. mkdir -p "$(dirname "$dest")"
  34. cp "$f2" "$dest"
  35. done
  36. # 无差异
  37. [ -z "$(find "$tmp3" -type f 2>/dev/null)" ] && {
  38. echo "两个 ZIP 内容完全一致,无需输出。"
  39. exit 0
  40. }
  41. # 打包
  42. (cd "$tmp3" && zip -qr ../out.zip .)
  43. mv "$tmp/out.zip" "$diffzip"
  44. echo "✅ 差异文件已保存到 $diffzip"