Linux環境などでZIPファイルを解凍する際、メインで使うコマンドといえば unzip ですよね。
単一のZIPファイルを新規フォルダを作成して解凍する場合は、unzip -d [作成するフォルダ名] [ファイル名.zip] で事足ります。しかし、「カレントディレクトリにある大量のZIPファイルを、それぞれ同名のフォルダを作成して一括で解凍したい」という場面が度々やってきます。
1つずつコマンドを叩くのは面倒なので、find や for ループと組み合わせて一括処理してしまうのが便利です。
方法1:find コマンドで頑張る場合
find コマンドでZIPファイルを検索し、xargs で回す方法です。
find ./ -type f -name "*.zip" | xargs -I {} bash -c 'unzip -d ${0%.zip} $0' {}- 解説:
findで見つけたZIPファイルのパスをxargsに渡し、bash -cを使ってシェルスクリプトとして実行しています。${0%.zip}というのは**「パラメータ展開」**と呼ばれる機能で、ファイル名から後ろの.zipという文字列を取り除いたものをフォルダ名(-dの引数)として指定しています。
方法2:for ループで頑張る場合(おすすめ!)
カレントディレクトリのZIPファイルだけであれば、for ループで回した方が記述が短くてスマートです。
for f in *.zip; do unzip -d "${f%.zip}" "$f"; done- 解説: こちらも先ほどと同様に、
${f%.zip}のパラメータ展開を利用して.zipの拡張子を削った名前のフォルダを作成し、その中に解凍(展開)しています。個人的にはこちらの方がシンプルで覚えやすいですね。
Windowsユーザーでも「Git Bash」があれば使える!
「LinuxのコマンドなんてWindowsじゃ使えないよ……」と思うかもしれませんが、Windowsに Git(Git for Windows) をインストールすると一緒についてくる 「Git Bash」 を使えば、上記のコマンドがそのままWindows上でも動きます!
実際の活用シーン:Beat Saberのカスタム曲導入
なぜ私がこのコマンドを重宝しているかというと、VRゲーム『Beat Saber』のカスタム曲を BEASTSAVER や BeatSaver で大量にダウンロードした際、一つひとつZIPを解凍してフォルダ分けするのがあまりにも面倒だったからです(笑)。
わざわざ専用のバッチファイル(.bat)を作るのも大げさなので、ダウンロードフォルダでGit Bashを開いてこの for コマンドを1発叩くだけで、一瞬で全曲のフォルダ分けが終わってめちゃくちゃ楽になりました!
大量のZIP解凍作業に追われている方は、ぜひ試してみてくださいね。