- 環境
- Windows10 64bit バージョン1909
- GitBash mintty 3.1.4
- UnZip 6.00 of 20 April 2009
※. 日本語のファイル名が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
そんな時、今いる場所にまとめてドバーーーっと解凍されると後で面倒くさい。
$ find {zipファイルが格納されているディレクトリ} -name *.zip | xargs -n1 unzip
かといって、どこか特定のディレクトリにまとめてドバーーーっとされても面倒くさい。
$ 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で複数のコマンドを実行する方法: 小粋空間
$ 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ファイルをコマンドで解凍する方法
# いちいちパスワードを聞かれなくなる
$ 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とかのツールで解凍するか、半端だ。