フォルダ内にずらっと並んだサブフォルダをすべて圧縮したいことがありますよね。
個別に手動で圧縮するのはたいへんな手間です。
圧縮時間の待ちがありますし、その間PCの動作は遅くなるし、良いことがありません。
そこで7zipのコマンドラインで、Windowsのバッチ処理でまとめて一括圧縮する方法をご紹介します。
サンプルコード形式です。
7zipインストール済みが前提です。
想定のフォルダ構成
どのようなフォルダ構成での動作を想定しているかご説明します。
ずらっとディレクトリ下に複数のフォルダがある環境です。compress_folders.bat
ファイルを作成し、サンプルコードを書き込み、ダブルクリックで処理を実行します。
次のようなフォルダ構成を想定しています。
実行ディレクトリ
│───compress_folders.bat
│───Aフォルダ
│ └───a.txt
│───Bフォルダ
│ └───b.txt
│───Cフォルダ
│ └───c.txt
└───Dフォルダ
└───d.txt
実行ディレクトリの下にあるA、B、C、Dフォルダをそれぞれ圧縮ファイルにします。
それではサンプルコードを見ていきましょう!
ディレクトリ内のすべてのフォルダを7z形式で圧縮する
7zipにはコマンドラインオプションがあります。
次の構文で、指定したフォルダやファイルを圧縮させることができます。
"7zipの実行ファイルのパス" a "圧縮後のファイルパス" "圧縮対象のファイルパス"
あるいは
7z a "圧縮後のファイルパス" "圧縮対象のファイルパス"
"7zipの実行ファイルのパス"
部分は、パスを通していれば7z
だけでもOKです。
この記事では、環境パスを通していない前提で説明します。
これを、すべてのフォルダを対象にバッチ処理するようにします。
適当なバッチファイルを作成して、次をコピペします。
例ではcompress_folders.bat
としました。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダを圧縮
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a "%source_folder%\!subfolder!.7z" "%%i"
)
pause
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
はお使いの環境の7zipのパスにしてください。
通常はProgram Files
の下にインストールしていることと思います。
実行結果がこちらです。
コマンドラインで7zipを使った圧縮が実行されます。
完了すると、それぞれのフォルダを圧縮した7zファイルが追加されました。
ディレクトリ内のすべてのフォルダについてフォルダの中身だけ圧縮する
下記のような構成のときに、圧縮ファイルを解凍したときに、a.txtだけを取り出したいことがあります。
実行ディレクトリ
│───compress_folders.bat
│───Aフォルダ
│ └───a.txt
│───Bフォルダ
│ └───b.txt
│───Cフォルダ
│ └───c.txt
└───Dフォルダ
└───d.txt
ディレクトリ内のすべてのフォルダについてフォルダの中身だけを圧縮指定するには、
次のようにします。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダを圧縮
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a "%source_folder%\!subfolder!.7z" "%%i\*"
)
pause
ポイントは"%%\i*"
です。
フォルダではなく、フォルダの下のすべてをワイルドカード指定しています。
圧縮後のファイルを開くとこんな感じです。
フォルダで圧縮される
フォルダの中身だけで圧縮される
通常はフォルダで圧縮するかと思います。
対象フォルダが多すぎて、仮の仕分けフォルダに入れてから圧縮する場合は、
フォルダの中身だけで圧縮したいことがあると思います。
仮の仕分けフォルダが不要なので。
目的に合わせて使い分けてみてはどうでしょうか。
ディレクトリ内のすべてのフォルダをzip形式で圧縮する
さて、次は圧縮形式を変えてみましょう。
zip形式です。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダを圧縮
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a -tzip "%source_folder%\!subfolder!.zip" "%%i"
)
pause
実行すると、今度はzip形式の圧縮ファイルが追加されます。
先ほどの7zと見比べてみてください。
違っているのは、"%zip_executable%" a -tzip "%source_folder%!subfolder!.zip" "%%i"
部分です。-tzip
というのが、zip形式で圧縮する、というオプション指定です。
また、圧縮ファイル名の拡張子を.zip
というように、圧縮したい形式に変えます。
ディレクトリ内のすべてのフォルダをtarアーカイブにまとめる
別の圧縮方法として、tarアーカイブというものがあります。
tar形式は無圧縮です。
ファイルサイズが小さくならないのですが、
多数あるファイルやフォルダを1つのアーカイブすることで取り扱いやすくなります。
ファイルサーバでファイル数が多すぎると、転送遅延やバックアップ時間の増加、ファイルヘッダ分だけディスクスペースをロスするなどの問題が起きます。
ひとまず無圧縮でアーカイブできると、処理時間少なめで、上記の問題を低減できます。
ということで、tarアーカイブにまとめるサンプルがこちらです。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダを圧縮
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a -ttar -mx=0 "%source_folder%\!subfolder!.tar" "%%i"
)
pause
-ttar -mx=0 "%source_folder%!subfolder!.tar"
部分が変わったところです。
tar形式を指定し、-mx=0
で無圧縮としています。
実行するとこのようになります。
無事にtar形式でアーカイブにまとめることができました。
ディレクトリ内のすべてのフォルダをtarアーカイブにしてbz2形式で圧縮する
先ほどは、アーカイブにまとめるメリットと方法をご紹介しました。
さらにファイルサイズを低減するには圧縮したいところです。
主にUNIX系で.tar.bz2のような形式で圧縮されているのですが、同じことを7zipを使ってWindowsでも実行できます。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダをtarでアーカイブ
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a -ttar -mx=0 "%source_folder%\!subfolder!.tar" "%%i"
)
rem tarを圧縮
set "extensions=.tar"
for %%E in (%extensions%) do (
for /r "%source_folder%" %%F in (*%%E) do (
"%zip_executable%" a -tbzip2 -mx=5 "%%~dpnF.tar.bz2" "%%~fF"
)
)
rem tarを削除
for %%E in (%extensions%) do (
for /r "%source_folder%" %%F in (*%%E) do (
del "%%F"
)
)
先ほどから登場している処理を少し拡張しています。
・.tarでアーカイブ
・.tarを対象に.bz2に圧縮
・要らなくなった.tarを削除
と、いくつかステップを踏んだ処理をしています。
実行するとこのようになります。
無事に.tar.bz2形式で圧縮アーカイブを作ることができました。
.tar.7zという形式にも変更可能です。
無圧縮のアーカイブ、という手法はtarでなくとも可能です。
tarだから無圧縮だな、と見て分かるメリットはありますが、
Windowsユーザーには見慣れない拡張子です。
Windows環境では、例えば、.zip.7zとして、
無圧縮のzipアーカイブにした後7zで圧縮する方が分かりやすいかもしれません。
補足
その他の形式(XZ, BZIP2, GZIP, TAR, WIM)で圧縮する
ここまででいくつか圧縮形式が登場しました。
7zipで圧縮可能なファイル形式は公式で示されています。
対応形式は7z, XZ, BZIP2, GZIP, TAR, ZIP, WIMです。
今回のサンプルコードでも、オプションを変えて対応可能です。
記事の末尾にチートシート形式で例を記載したいと思います。
圧縮オプション
最後は圧縮オプションについてです。
拡張子のほかに、圧縮アルゴリズムと圧縮レベルを指定できます。
圧縮形式:
7z形式: -t7z
xz形式: -txz
BZIP2形式: -tbzip2
GZIP形式: -tgzip
TAR形式: -ttar
ZIP形式: -tzip
WIM形式: -twim
圧縮アルゴリズム:
-m0=lzma: LZMA
-m0=lzma2: LZMA2
-m0=deflate: Deflate
-m0=bzip2: BZip2
-m0=ppmd: PPMd
圧縮率:
-mx=0: 無圧縮
-mx=1: 最速
-mx=3: 高速
-mx=5: 標準
-mx=7: 最高
-mx=9: 超ウルトラ圧縮
記述例:
“%zip_executable%” a -mx=5 -m0=deflate “%source_folder%!subfolder!.7z” “%%i*”
アーカイブするだけで良い場合は圧縮レベルを下げれば良いです。
容量重視で時間が掛かっても許容できるなら、圧縮レベルを10以上にすることもできます。
是非お試しください。
チートシート集
基本のサンプルコードに、一部を差し替えるだけで色々できます。
@echo off
setlocal enabledelayedexpansion
rem 現在のディレクトリ
set "source_folder=%cd%"
rem 7zipのパス
set "zip_executable=C:\Program Files\7-Zip\7z.exe"
rem ディレクトリ下のフォルダを圧縮
for /d %%i in ("%source_folder%\*") do (
set "subfolder=%%~nxi"
"%zip_executable%" a "%source_folder%\!subfolder!.7z" "%%i"
)
pause
7z形式
“%zip_executable%” a “%source_folder%!subfolder!.7z” “%%i”
zip形式
“%zip_executable%” a -tzip “%source_folder%!subfolder!.zip” “%%i”
フォルダの中身だけ圧縮
“%zip_executable%” a “%source_folder%!subfolder!.7z” “%%i*”
Deflateアルゴで圧縮
“%zip_executable%” a -mx=5 -m0=deflate “%source_folder%!subfolder!.7z” “%%i”
超ウルトラ圧縮
“%zip_executable%” a -mx=9 “%source_folder%!subfolder!.7z” “%%i”
超超ウルトラ圧縮
“%zip_executable%” a -mx=20 “%source_folder%!subfolder!.7z” “%%i”
無圧縮
“%zip_executable%” a -mx=0 “%source_folder%!subfolder!.7z” “%%i”
今回は以上となります。
本記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!