#!/bin/sh usage() { cat <&2 "$type: $source" case "$type" in new|changed|deleted) echo "$source" ;; excluded) ;; deleted|*) echo >&2 " * Sorry, can't handle deletion of $source." ;; esac } tempdir=`mktemp -d -t zipdiff.XXXXXX` newline=" " fromlist="$(zipinfo -1 "$from" | grep -v /\$)" tolist="$(zipinfo -1 "$to" | grep -v /\$)" diffit() { echo "$fromlist" | while IFS= read -r line; do case "$newline$tolist$newline" in *$newline$line$newline*) ;; *) found deleted "$line" ;; esac done echo "$tolist" | while IFS= read -r line; do case "$newline$fromlist$newline" in *$newline$line$newline*) # check if equal isexcluded=false for P in $excludes; do case "$line" in $P) found excluded "$line" isexcluded=true break ;; esac done if ! $isexcluded; then unzip -p "$from" "$line" > "$tempdir/v1" unzip -p "$to" "$line" > "$tempdir/v2" if ! diff --brief "$tempdir/v1" "$tempdir/v2" >/dev/null 2>&1; then found changed "$line" fi rm "$tempdir/v1" rm "$tempdir/v2" fi ;; *) found new "$line" ;; esac done } result=`diffit` case "$output" in '') ;; *) rm -f "$output" echo "$result" | while IFS= read -r line; do echo >&2 "extracting $line..." dline=./$line mkdir -p "$tempdir/${dline%/*}" unzip -p "$to" "$line" > "$tempdir/$line" # this may create an empty file - don't care, DP handles this as deletion done case "$output" in /*) ;; *) output=`pwd`/$output ;; esac cd "$tempdir" #zip -9r "$output" . 7za a -tzip -mx=9 "$output" . cd .. ;; esac rm -rf "$tempdir"