😸

圧縮・解凍を自動化(7zip)

2024/04/27に公開

7zipとは

7zipとは解凍・圧縮ツールです。
このツールの便利なところは、コマンドラインで解凍・圧縮することができる点です。
バッチファイルでも実施できるので、自動化に向いています。
ZIPファイルの中の特定のファイルを取り出すなどの自動化が可能です。
以下からダウンロード可能です。
https://sevenzip.osdn.jp/download.html

使い方

自動化をするために、バッチファイルでも使用できるコマンドラインでの使用方法を中心に解説します。

コマンド 説明
a zipファイルにファイル/フォルダを追加
d zipファイルから指定ファイルを削除
e zipファイルを解凍
x zipファイルを階層含めて解凍
l zipファイル内のファイルの一覧
rn zipファイル内のファイル名をリネーム
t zipファイルの整合性をテストする
u zipファイルの更新

公式サイトに説明があります。
https://sevenzip.osdn.jp/chm/cmdline/commands/index.htm

解凍

eとxの違い

eとxコマンドは、どちらも解凍コマンドですが、フォルダの階層を復元するかどうかが異なります。
eコマンドはzipファイルの中が階層の場合でも、全て解凍するフォルダ内の直下に解凍します。
xコマンドはzipファイルの中が階層の場合は、その階層構造を維持して解凍します。
従来の解凍と同じ階層を維持するxコマンドを使うほうが無難です。

zipファイルの階層構造
sample
├─A
│ └─aa.txt
└─B
└─bb.txt

eコマンドで解凍するとすべて同一階層に解凍されます。また、フォルダのA,Bの中身は空になり、元々A、Bフォルダの中身は、同一階層に解凍されます。

eコマンドで解凍した場合
A
B
aa.txt
bb.txt

xコマンドで解凍すると、zipファイルの階層構造を維持して解凍してくれます。

sample
├─A
│ └─aa.txt
└─B
└─bb.txt

特定のファイルを解凍

zipファイルをすべて解凍すると時間もかかる上に、容量も圧迫します。
特定ファイルだけ解凍できれば、解答時間も短縮できる上に容量も抑えることができます。

zipファイル内に複数階層ある時に、xmlファイルのみ解凍したい場合は以下のようにします。

"C:\Program Files\7-Zip\7z.exe" x -y -o出力パス -ir!*.xml foo.zip

ファイルの指定は複数可能です。
xmlファイル以外にもtxtファイルも同時に解凍できます。

"C:\Program Files\7-Zip\7z.exe" x -y -o出力パス -ir!*.xml -ir!*.txt foo.zip

| コマンド/オプション |
| ---- | ---- |
| x | zipファイルを階層含めて解凍 |
| -y | 同名ファイルの上書きの質問などに対してすべて「はい」と解凍する |
| -o | 出力ディレクトリの指定 |
| -i | ファイル名とワイルドカードを指定 |
| -r | サブディレクトリに対して再帰処理を実施 |
| ! | ワイルドカード 「!*.xml」でXMLファイルすべてを意味する。 |

圧縮

「a」コマンドで圧縮が可能です。
.zipは任意の名前を指定します。次にフォルダを指定します。

"C:\Program Files\7-Zip\7z.exe" a ○○.zip subdir\

サブディレクトリを含む特定のファイルのみの圧縮も可能です。
-rは再帰的に処理することを意味します。
つまり、複数階層あってもすべてのtxtファイルを圧縮します。

"C:\Program Files\7-Zip\7z.exe" a  ○○.zip *.txt -r

パスワード付きで圧縮

「-p」でパスワード付きで圧縮できます。以下のように”foo”とパスワードを付けることができます。

"C:\Program Files\7-Zip\7z.exe" a  ○○.zip -pfoo

自動化

バッチファイルを使用した自動化について紹介します。
解凍、圧縮のいずれでもバッチファイルで実行できます。

zipと同階層に特定ファイルのみ解凍

これで、zipと同階層に特定ファイルが解凍されます。

rem 第1引数に指定されたらzipファイルがあるディレクトリに移動
cd %~dp1
rem zipファイルからxmlファイルのみを解凍し、zipファイルのディレクトリに解凍。
"C:\Program Files\7-Zip\7z.exe" x -y -o"%~dp1" -ir!*.xml "%1"

Discussion