ターミナル上でzipファイルの差分を比較する

Twitterでそんなのあったので、いつか自分にも必要なときが来るかもしれないので備忘で残しておく。 圧縮ファイルの中身が、サイズが少なくてほとんど差異が無いのであれば、以下のように比較してやると楽に差異が確認できる。

diff -y <(unzip -c test1.zip) <(unzip -c test2.zip)

でもこれ、目diffをちょっとやりやすくしただけでなかなかツライよなぁ… もうちょっとなんとかならないかなと思ったので、無理やり以下のように圧縮ファイル内の各ファイルごとにdiffをかけさせてみた。

(X="test1.zip" Y="test2.zip";echo "unzip -l "{$X,$Y}"@" | xargs -d@ -n1 sh -c | awk '$1 != 0 && $2 ~ /^[0-9]/ {print $4}' | sort -u | xargs -I@ bash -c "echo @;diff <(unzip -p $X @) <(unzip -p $Y @)")

[root@BS-PUB-CENT7-01 ~]# unzip -l test1.zip
Archive:  test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      120  05-13-2017 00:20   test/A.txt
      120  05-13-2017 00:20   test/B.txt
      120  05-13-2017 00:20   test/C.txt
---------                     -------
      360                     3 files
[root@BS-PUB-CENT7-01 ~]# unzip -l test2.zip
Archive:  test2.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      128  05-13-2017 00:27   test/A.txt
      120  05-13-2017 00:20   test/B.txt
      120  05-13-2017 00:22   test/C.txt
---------                     -------
      368                     3 files
[root@BS-PUB-CENT7-01 ~]# (X="test1.zip" Y="test3.zip";echo "unzip -l "{$X,$Y}"@" | xargs -d@ -n1 sh -c | awk '$1 != 0 && $2 ~ /^[0-9]/ {print $4}' | sort -u | xargs -I@ bash -c "echo @;diff <(unzip -p $X @) <(unzip -p $Y @)")
test/A.txt
8c8,9
< AAA08 --- > AAA88
> AAA8888
test/B.txt
test/C.txt
4c4
< CCC04 --- > DCC04
test/D.txt
caution: filename not matched:  test/D.txt
0a1,10
> DDD01
> DDD02
> DDD03
> DDD04
> DDD05
> DDD06
> DDD07
> DDD08
> DDD09
> DDD10

…ちょっと(だいぶ)ごちゃっとしてるけど、とりあえず良いか。 もうちょっとキレイに書けそうな気もするけど、どうなんだろう。