私が業務でバッチ処理を作る際に、処理のなかで圧縮と解凍が必要な場合によく利用するのが、定番のフリーソフトの「7-Zip」です。
今回は、この定番のフリーソフトの「7-Zip」をコマンドラインで操作する方法を簡単に紹介します。
オープンソースのファイルアーカイバ「7-Zip」について
私がこよなく愛するアーカイバ「7-Zip」ですが、なかには聞いたことが無い人もいるかと思います。
参考までにWikipediaの記事を引用します。
7-Zip
7-Zip(セブンジップ)は、Microsoft Windowsを主な対応OSとするオープンソースのファイルアーカイバである。
7-Zip は、基本的に 7z 書庫形式を操作するファイルアーカイバであるが、他の様々な種類の書庫形式にも対応している(Windows以外のOSには、対応する書庫形式の限られたCUI版が移植されている)。~~中略~~
7-Zipの操作は、コマンドライン(全システム)、GUI(Windows のみ)、もしくはシームレスな Windows シェル環境の、いずれの方式を用いることができる。
プロプライエタリな競争相手であり市場を先導するWinZipやWinRARと異なり、7-ZipはGNU LGPLの下で(ただしRARライセンスの制限がある)、AESのコードは修正 BSDライセンスの下で配布されているフリーソフトウェアである。
7-Zip Wikipediaより
Wikipediaに記載されている内容も踏まえつつ、「7-Zip」の具体的な特徴を紹介します。
・オープンソースによるフリーソフト
・7z書庫形式のファイルアーカイバだが、他の書庫形式にも対応
・コマンドラインとGUI操作の両方に対応
・7z書庫形式の場合はファイルサイズの制限は無い
・インストールしなくても使用可能
・書庫の暗号化と復号化に対応
・圧縮率が非常に高い
上記の特徴のなかでも特筆すべきは、コマンドラインで使用できることと、インストールが不要なことです。
バッチ処理を作る際に採用するプログラム言語によっては、その言語の標準ライブラリにZip形式などの圧縮、解凍処理が組み込まれているのですが、私が愛用するVBScriptなどでは、そのような気の利いた機能はありません。
その為、VBScript内で無理やり圧縮や解凍処理をオリジナルで作り込むか(普通はそんな面倒なことはやりませんが)、コマンドラインに対応した外部のアーカイバソフトの機能をプログラム上で呼び出して処理を実現します。
ただ、サーバー上などでバッチを実行させたい場合は、元々稼働しているミドルウェアなどへの影響を気にして、可能な限り新規アプリケーションをインストールするのは避けたいと考えます。
その為、インストールをしなくても、対象のアプリケーションのexeファイルがあれば使用できるというのは大きなメリットです。
また、上記以外にも大事なのは、7-Zipの独自書庫形式である7zファイルで圧縮する場合は、圧縮対象のファイルのサイズ制限を受けないという部分もあります。
あまり一般的には知られていませんが、世に広く使われている「ZIP」書庫形式、所謂Zipファイルの場合は、本来は圧縮対象のファイルサイズが4GBまでしか対応していません。
それ以上のファイルサイズのファイルを圧縮すると、一見すると正常に圧縮できたように見えるが、実はデータが壊れていたり、解凍が出来なかったりします。
もしZIP形式で4GB以上のファイルサイズのファイルを正常に圧縮して解凍できている場合は、それは純粋なZip形式ではなく、内部的に拡張された特殊なZip形式のファイルです。
そういったZIPファイルはWindows標準機能の解凍処理では解凍できません。
ZIP書庫形式では上記のような様々な制約がありますが、7z書庫形式の場合は、そういったファイルサイズに因んだ制約を受けることはありません。
よって、例えばデータベースのバックアップファイルなどの大きなファイルサイズのデータでも正常に圧縮と解凍ができます。
後は、7z書庫形式だけではなく、ZIP形式やその他の一般的な書庫形式に広く対応しているので、汎用性も高いのも魅力です。
「7-Zip」のダウンロード
それでは、早速「7-Zip」を手に入れましょう。
以下のURLにアクセスしてください。
「7-Zip」の実行ファイルやインストーラーがダウンロードできます。
このページ内の「圧縮・解凍ソフト7-Zip 19.00 (2019-02-21) Windows版のダウンロード:」のなかの、概要:「7-Zip Extra: コマンドラインバージョン、7z形式のライブラリ、FAR Manager用のプラグイン」の行のリンクからダウンロードしてください。
ダウンロードしたファイルを解凍すると、そのフォルダ内に「7za.exe」が含まれており、それが「7-Zip」の本体です。
ダウンロードすると、ダウンロードされてきたファイルは、7z形式で圧縮されています。
その為、その7z形式のファイルを解凍する為のアーカイバツールを予め用意しておかないといけません。
尚、Windows標準の機能では対応していないため、そこだけは注意してください。
Lhaplusなどの一般的なアーカイバツールなら大体7z形式に対応しているので、それらがインストールされていれば問題はありません。
「7-Zip」の基本的なコマンド操作例と覚えておくべきオプション一覧
「7-Zip」をコマンドで実行するやり方と、コマンド実行する場合に覚えておくべきオプションを紹介していきます。
「7-Zip」自体は非常に多機能ですが、実務で実際に必要になる機能は限定的なので、必要そうな部分を抜粋して紹介します。
因みに、「7-Zip」のコマンドライン版の全機能は以下のリンク先に掲載されています。
7-Zip Command Line Version User’s Guide
今回紹介する機能以外にも様々な機能がある為、興味があれば目を通してもらうことをおススメします。
尚、当項での解説は、Windows上で実行することを前提とし、且つ、コマンドプロンプトにてCDコマンドでカレントディレクトリを「7za.exe」が置かれているフォルダまで移動してきている前提とします。
ファイルやフォルダの圧縮操作の基本
圧縮では 7za.exe の起動引数として a を渡します。
この a は、archive 又は add の両方の用途からきているので、覚えやすいです。
圧縮先ファイル名が既に存在しているなら、圧縮ファイルに指定されたファイルやフォルダを加えます。
圧縮先ファイルが存在しなければ、新規に圧縮ファイルを作成します。
圧縮対象がファイルの場合
7za.exe a [圧縮後のファイル名] [圧縮対象のファイル名]
使用例:
7za.exe a C:\test\archive.7z C:\test\archive.txt
archive.txtをファイル名「archive.7z」に指定して圧縮します。
圧縮対象がフォルダの場合
7za.exe a [圧縮後のファイル名] [圧縮対象のフォルダ]
使用例:
7za.exe a C:\test\archive.7z C:\sample
「sample」フォルダをファイル名「archive.7z」に指定して圧縮します。
圧縮対象が指定したフォルダ内のすべてのファイルの場合
7za.exe a [圧縮後のファイル名] [圧縮対象のフォルダ]\
使用例:
7za.exe a C:\test\archive.7z C:\sample\
「sample」フォルダ内のすべてのファイルをファイル名「archive.7z」に指定して圧縮します。
圧縮対象が指定したフォルダ内の全ての.txtファイルの場合
※「7-Zip」ではワイルドカードに対応しています。
7za.exe a [圧縮後のファイル名] [圧縮対象のフォルダ]\*.txt
使用例:
7za.exe a C:\test\archive.7z C:\sample\*.txt
「sample」フォルダ内のすべての.txtファイルをファイル名「archive.7z」に指定して圧縮します。
圧縮ファイルの解凍操作の基本
解凍では 7za.exe の起動引数として x を渡します。
この x は、extractの用途からきており、解凍では e という文字も渡せますが、e では、圧縮時のフォルダ構成を無視して解凍する処理になるので、通常はx で問題ありません。
※出力先フォルダに解凍したファイル群をぶちまける感じになります。
カレントディレクトリに解凍する場合
7za.exe x [圧縮後ファイル名]
使用例:
7za.exe x C:\test\archive.7z
「archive.7z」をカレントディレクトリに解凍します。
解凍対象のファイルは7z形式でもzipでも同じ構文で処理可能です。
覚えておくべきよく使われるオプション
「7-Zip」では、前述した機能文字を渡して処理を実行しますが、色々と用意されている「オプション」を指定することで、実行時の設定を細かく行えます。
この「オプション」もすべて覚える必要はなく、いくつかのオプションを覚えておけば十分です。
そのオプションを紹介していきます。
-o
|
出力先ディレクトリを指定します。 ※スペース不要 |
---|---|
使用例:解凍先ディレクトリにtestフォルダ配下を指定して解凍7za.exe x -oC:\test\ C:\test\archive.7z |
-y
|
上書き確認などの確認応答を全てyesで指定。 |
---|---|
使用例7za.exe x -y C:\test\archive.7z |
-p
|
圧縮時、または解凍時のパスワードを指定します。 ※スペース不要 |
---|---|
使用例:解凍パスワードにsamplepasswordを指定してカレントディレクトリに解凍7za.exe x -psamplepassword C:\test\archive.7z |
-mem=AES256
|
圧縮の際にAES-256を使用して暗号化をします。 -mが詳細設定用オプションでemが暗号化方式指定オプション 【注意】7z形式には未対応。ZIP形式のみ |
---|---|
使用例:暗号化形式AES-256、パスワードにsamplepasswordを指定してtestフォルダを圧縮7za.exe a -mem=AES256 -psamplepassword C:\test\archive.zip C:\test |
上記以外にも、様々なオプションを指定することが可能ですが、通常は上記のオプションを知っていれば十分です。
また、上記のオプションは単体で使用するだけではなく、複数のオプションを同時に指定することも可能なので、必要によってオプションを組み合わせて使用してください。
【おまけ】7-Zipのコマンドオプションとスイッチの一覧
コマンドラインで7-Zipの実行ファイルを引数無しで実行すると、コマンドオプションとスイッチの一覧が表示されます。
参考までに当項でも転載しておきます。
Usage: 7za <command> [<switches>...] <archive_name> [<file_names>...] [@listfile] <Commands> a : Add files to archive b : Benchmark d : Delete files from archive e : Extract files from archive (without using directory names) h : Calculate hash values for files i : Show information about supported formats l : List contents of archive rn : Rename files in archive t : Test integrity of archive u : Update files to archive x : eXtract files with full paths <Switches> -- : Stop switches and @listfile parsing -ai[r[-|0]]{@listfile|!wildcard} : Include archives -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives -ao{a|s|t|u} : set Overwrite mode -an : disable archive_name field -bb[0-3] : set output log level -bd : disable progress indicator -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line -bt : show execution time statistics -i[r[-|0]]{@listfile|!wildcard} : Include filenames -m{Parameters} : set compression Method -mmt[N] : set number of CPU threads -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra) -o{Directory} : set Output directory -p{Password} : set Password -r[-|0] : Recurse subdirectories -sa{a|e|s} : set Archive name mode -scc{UTF-8|WIN|DOS} : set charset for for console input/output -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands -sdel : delete files after compression -seml[.] : send archive by email -sfx[{name}] : Create SFX archive -si[{name}] : read data from stdin -slp : set Large Pages mode -slt : show technical information for l (List) command -snh : store hard links as links -snl : store symbolic links as links -sni : store NT security information -sns[-] : store NTFS alternate streams -so : write data to stdout -spd : disable wildcard matching for file names -spe : eliminate duplication of root folder for extract command -spf : use fully qualified file paths -ssc[-] : set sensitive case mode -sse : stop archive creating, if it can't open some input file -ssw : compress shared files -stl : set archive timestamp from the most recently modified file -stm{HexMask} : set CPU thread affinity mask (hexadecimal number) -stx{Type} : exclude archive type -t{Type} : Set type of archive -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options -v{Size}[b|k|m|g] : Create volumes -w[{path}] : assign Work directory. Empty path means a temporary directory -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames -y : assume Yes on all queries
コロンの無いスイッチは、その後ろにスペースを空けずに指定してください。
当記事のサンプルコマンド例で言えば、パスワードを指定する場合の-pのようにスペースを空けずにコマンドを記述します。
最後に
今回は、フリーソフトのアーカイバにおいて、コマンドラインでの操作が充実しており、インストールもせずに利用できることから、バッチ処理とも大変相性の良い、「7-Zip」を紹介しました。
この様な優秀なソフトが無償で利用できるのは本当に有難く、私にできることは、このような優秀なソフトを世に広めるために、使い方を紹介させていただくことだけです。
是非皆さまも活用してみてください。
それでは今回も読んでいただきましてありがとうございました。