技術・開発

【Linux/Bash】複数のZIPファイルを同名フォルダに一括解凍する便利コマンド

2022年2月5日

Linux環境などでZIPファイルを解凍する際、メインで使うコマンドといえば unzip ですよね。

単一のZIPファイルを新規フォルダを作成して解凍する場合は、unzip -d [作成するフォルダ名] [ファイル名.zip] で事足ります。しかし、「カレントディレクトリにある大量のZIPファイルを、それぞれ同名のフォルダを作成して一括で解凍したい」という場面が度々やってきます。

1つずつコマンドを叩くのは面倒なので、findfor ループと組み合わせて一括処理してしまうのが便利です。

方法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』のカスタム曲を BEASTSAVERBeatSaver で大量にダウンロードした際、一つひとつZIPを解凍してフォルダ分けするのがあまりにも面倒だったからです(笑)。

わざわざ専用のバッチファイル(.bat)を作るのも大げさなので、ダウンロードフォルダでGit Bashを開いてこの for コマンドを1発叩くだけで、一瞬で全曲のフォルダ分けが終わってめちゃくちゃ楽になりました!

大量のZIP解凍作業に追われている方は、ぜひ試してみてくださいね。

-技術・開発
-, , , , , , ,