A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

nzip: 入れ子のzipファイルを展開する

あるzipファイルを展開すると中にはzipファイルがあって、そのまた中にはzipファイルがあって、マトリョーシカ的になっていることがある。 例えば、JARファイルに含まれる依存ライブラリのJARが提供するクラスも一括で見たいとき、一階層ずつ展開していくのはつらい。

nzipというJava製ツールを試してみたら便利だった。 github.com

使い方

インストール

git cloneするだけ。

$ git clone https://github.com/ankitkaushal/nzip.git

実行方法

nzip.jarが本体なのでJavaで実行する。

$ java -jar /path/to/nzip/nzip.jar -h
usage: nzip
 -c <arg>   required please enter the command name - list,extract or
            compress
 -e <arg>   please enter the zip extensions separated by comma
 -h         help
 -s <arg>   required please enter source directory or file
 -t <arg>   please enter target file or directory
 -u <arg>   please enter the suffix for extracting zip directories
$

テスト用に入れ子zipファイルを作成

zipコマンドでsample1.txt -> nested1.zip -> nested2.zip -> nested3.zipとzipの中にzipを入れていく。

$ zip nested1.zip sample.txt
  adding: sample.txt (stored 0%)
$ zipinfo -1 nested1.zip
sample.txt
$
$ zip nested2.zip nested1.zip
  adding: nested1.zip (stored 0%)
$ zipinfo -1 nested2.zip
nested1.zip
$
$ zip nested3.zip nested2.zip
  adding: nested2.zip (stored 0%)
$ zipinfo -1 nested3.zip
nested2.zip
$
$ rm sample.txt nested1.zip nested2.zip

展開せずにファイル一覧を表示

展開しないで中身だけ知りたいとき助かる。

$ java -jar /path/to/nzip/nzip.jar -c list -s nested3.zip
/nested2.zip
/nested2.zip/nested1.zip
/nested2.zip/nested1.zip/sample.txt
$

入れ子zipを一括展開

デフォルトではzipを展開してできたディレクトリに拡張子.nzipがつく。

$ java -jar /path/to/nzip/nzip.jar -c extract -s nested3.zip -t .
command has executed successfully
$
$ tree nested2.zip.nzip
nested2.zip.nzip
└── nested1.zip.nzip
    └── sample.txt

1 directory, 1 file
$

出力先ディレクトリや展開したディレクトリにつける拡張子を指定できる。

$ java -jar /path/to/nzip/nzip.jar -c extract -s nested3.zip -t nested3 -u .dir
command has executed successfully
$
$ tree nested3
nested3
└── nested2.zip.dir
    └── nested1.zip.dir
        └── sample.txt

2 directories, 1 file
$

比較のためunzipで展開した場合

$ ls
nested3.zip
$
$ unzip nested3.zip
Archive:  nested3.zip
 extracting: nested2.zip
$ ls
nested2.zip  nested3.zip
$
$ unzip nested2.zip
Archive:  nested2.zip
 extracting: nested1.zip
$ ls
nested1.zip  nested2.zip  nested3.zip
$
$ unzip nested1.zip
Archive:  nested1.zip
 extracting: sample.txt
$ ls
nested1.zip  nested2.zip  nested3.zip  sample.txt
$

zipとみなす拡張子を指定

デフォルトで.war、.ear、.jar、.zipをzipファイルとみなして展開するとのこと。それ以外の拡張子でも-eオプションで指定できる。

適当に拡張子を.z_i_pにしてzipファイルに含めてみる。

$ touch sample.txt
$ zip demo.z_i_p sample.txt
  adding: sample.txt (stored 0%)
$
$ zip test.zip demo.z_i_p
  adding: demo.z_i_p (deflated 47%)
$
$ zipinfo -1 test.zip
demo.z_i_p
$

デフォルトでは展開されない。

$ java -jar /path/to/nzip/nzip.jar -c list -s test.zip
/demo.z_i_p
$

-e z_i_pを指定すると展開される。

$ java -jar /path/to/nzip/nzip.jar -c list -s test.zip -e z_i_p
/demo.z_i_p
/demo.z_i_p/sample.txt
$