ある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 $