0
1

More than 3 years have passed since last update.

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

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

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

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

やりたいこと : zipファイルと同じ場所にそれぞれ解凍してほしい

サブディレクトリにzipファイルが格納されている。
zipは全部同じパスワードがくっついている。
そしてzipの中身のファイル名には日本語もある。

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

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

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

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

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

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

試行錯誤

dirnameコマンドでディレクトリパスを取得できる

ディレクトリ名
$ dirname /path/to/hoge
/path/to
パスからディレクトリ名/ファイル名を取り出す - Qiita

やりたいことができない
# 単純に書き加えてみた
$ 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で複数のコマンドを実行する方法: 小粋空間

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ファイルをコマンドで解凍する方法

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
が、このunzipにはそんなオプションがない・・・ここまできて・・・

$ 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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1