パスワード付き複数のzipファイルを各zipファイルと同じ場所に解凍する方法


- 環境
    - Windows10 64bit バージョン1909
    - GitBash mintty 3.1.4
    - UnZip 6.00 of 20 April 2009

※. 日本語のファイル名がzipファイルに含まれていると文字化けします。

```bash:パスワード付き複数のzipファイルを各zipファイルと同じ場所に解凍する方法
# -Iオプションではパスワードに含まれない文字(以下では「{}」)を指定する
$ find {zipファイルが格納されているディレクトリ} -name *.zip | xargs -n1 -I {} bash -c 'unzip -p {パスワード} "{}" -d $(dirname "{}")'
```

# やりたいこと : zipファイルと同じ場所にそれぞれ解凍してほしい
サブディレクトリにzipファイルが格納されている。
zipは全部同じパスワードがくっついている。
そしてzipの中身のファイル名には日本語もある。

```text
unzipを実行するディレクトリ
 ├ ぽんすけ
 ｜ └ PON_hoge_20200429.zip
 ├ かめ
 ｜ └ KAM_hoge_20200429.zip
 ├ うさぎ
 ｜ └ USA_hoge_20200531.zip
 ├ たぬき
 ｜ └ TAN_hoge.zip
 └ japanese
    └ JPN_fuga(tokyo).zip
```

そんな時、今いる場所にまとめてドバーーーっと解凍されると後で面倒くさい。

```bash:複数のzipファイルを今いる場所に解凍する方法
$ find {zipファイルが格納されているディレクトリ} -name *.zip | xargs -n1 unzip
```

かといって、どこか特定のディレクトリにまとめてドバーーーっとされても面倒くさい。

```bash:複数のzipファイルを解凍先を指定して解凍する方法
$ find {zipファイルが格納されているディレクトリ} -name *.zip | xargs -n1 unzip -d {解凍先のディレクトリ}
```

zipファイルと同じ場所にそれぞれ解凍してほしい。

# 試行錯誤

## `dirname`コマンドでディレクトリパスを取得できる
> ディレクトリ名
> $ dirname /path/to/hoge
> /path/to
> [パスからディレクトリ名/ファイル名を取り出す - Qiita](https://qiita.com/nntsugu/items/7d9dc6fd1f53ad12ecd3)


```bash:やりたいことができない
# 単純に書き加えてみた
$ find -name *.zip | xargs -n1 -I % unzip -d dirname %
Archive:  ./ぽんすけ/PON_hoge_20200429.zip
[./ぽんすけ/PON_hoge_20200429.zip] PON_hoge_20200429.csv password:
  inflating: dirname/PON_hoge_20200429.csv
...省略...

# (結果)dirnameというディレクトリを指定したことになった
$ find
...省略...
./dirname
./dirname/tokyo_fuga_20150302_âeâXâgé¦é¿Æméþé¦.pdf
...省略...
$ rm -rf dirname
```

## `bash -c`を使うと`xargs`で複数コマンドを実行できる
> `% find . -type d | xargs -I{} bash -c 'mkdir {}/foo; chmod 777 {}/foo'`
> ということで、mkdirやchmodをxargsの中で直接実行するのではなく、bashコマンドを実行し、"-c"オプションでの後続をコマンドとして実行するようにします。
> [xargsで複数のコマンドを実行する方法: 小粋空間](http://www.koikikukan.com/archives/2015/10/23-003333.php)

```bash:dirnameコマンドの結果を「-d」オプションに指定できた
$ find -name *.zip | xargs -n1 -I% bash -c 'unzip "%" -d $(dirname "%")'
Archive:  ./ぽんすけ/PON_hoge_20200429.zip
[./ぽんすけ/PON_hoge_20200429.zip] PON_hoge_20200429.csv password:
  inflating: ./ぽんすけ/PON_hoge_20200429.csv
...省略...
[./japanese/JPN_fuga(tokyo).zip] tokyo_fuga_20150302_▒e▒X▒g▒▒▒m▒▒▒.pdf password:
  inflating: ./japanese/tokyo_fuga_20150302_▒e▒X▒g▒▒▒m▒▒▒.pdf
  inflating: ./japanese/tokyo_fuga_20150302_▒▒▒▒▒▒Y▒▒▒E▒▒▒▒▒▒▒m▒▒▒.pdf
  inflating: ./japanese/tokyo_fuga_20150303_▒▒▒▒▒▒Y▒▒▒E▒▒▒▒▒▒▒m▒▒▒.pdf
  inflating: ./japanese/tokyo_fuga_20150304_▒▒▒▒▒▒Y▒▒▒E▒▒▒▒▒▒▒m▒▒▒.pdf
```

## `unzip`の`-P`オプションでパスワードを指定できる
> パスワード付きのzipファイルを解凍する
> パスワード付きの場合は、-Pオプションにパスワードを渡して解凍します。
> $ unzip -P yourpassword yourzip.zip
[Linuxでzipファイルをコマンドで解凍する方法](https://www.virment.com/how-to-unzip-in-linux/)

```bash:Iオプションで指定する文字をパスワードに含まれない文字に変更する
# いちいちパスワードを聞かれなくなる
$ find -name *.zip | xargs -n1 -I {} bash -c 'unzip -p 123%@abc "{}" -d $(dirname "{}")'
Archive:  ./ぽんすけ/PON_hoge_20200429.zip
  inflating: ./ぽんすけ/PON_hoge_20200429.csv
...省略...
  inflating: ./japanese/tokyo_fuga_20150304_▒▒▒▒▒▒Y▒▒▒E▒▒▒▒▒▒▒m▒▒▒.pdf
```


## 日本語の文字化けが解決できない
`-O`オプションで解決する`unzip`もある。
[unzipコマンドで日本語が文字化けした際の文字コード指定 - Qiita](https://qiita.com/daijinload/items/c2e5d3c7c62c3866ae07)
が、この`unzip`にはそんなオプションがない・・・ここまできて・・・

```bash
$ unzip
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
... 省略...

# 文字化けする理由はこの辺だろうか・・・
$ unzip -hh
... 省略...
Unicode:
  If compiled with Unicode support, unzip automatically handles archives
  with Unicode entries.  Currently Unicode on Win32 systems is limited.
  Characters not in the current character set are shown as ASCII escapes
  in the form #Uxxxx where the Unicode character number fits in 16 bits,
  or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex
  digit.
... 省略...
```

文字コード判別機能付き解凍コマンド`unar`を試してみた。
ファイル名は文字化けしなくなったが、ファイルの中身が壊れた・・・。
[日本語を含むZIPファイルを文字化けせず解凍する方法 - Qiita](https://qiita.com/hoo89/items/46dcd8134061c392772f)

文字化けしたのだけ、7Zipとかのツールで解凍するか、半端だ。