paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

7zipのコマンドラインで圧縮と解凍

私の現場はオンプレ環境なのでマシン室に入っての作業があるのですが、作業ログを固めて事務所に持って帰るという作業が発生します。
サーバのログはtarで固めればいいですが、teraterm等のローカル側でのログも回収しないといけません。

マシン室の端末での作業を余儀なくされますが、圧縮の際毎回ポチポチと作業するのは面倒です。

幸いにも圧縮ツールは7zipがインストールされています。
7zipはCLIでの操作が出来ますので、楽するために今回はこれを覚えようと思います。

ググれば沢山出てきますが自分のブログの方が探しやすいですからね。

環境

サブWindowsPCで検証します。
7zipはインストールしてあるものとし、パスは通してません。

  • OSバージョン
PS C:\Users\masashi\7ziptest> Get-WmiObject Win32_OperatingSystem


SystemDirectory : C:\WINDOWS\system32
Organization    :
BuildNumber     : 18363
RegisteredUser  : user
SerialNumber    : 00330-80000-00000-AA868
Version         : 10.0.18363
  • 7zipバージョン

実行ファイルは7z.exeです。

PS C:\Users\masashi\7ziptest> & 'C:\Program Files\7-Zip\7z.exe' --help

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]

ヘルプを見ると機能が沢山ありますが、断トツに使うフォルダの圧縮・解凍のみ確認します。
コマンドがバーッと出てきますが長いのでここでは割愛。

ちなみに7zipでは必須引数をcommand、オプション引数をswitchiesと言うそうです。
以下コマンド、スイッチで表記します。

圧縮

  • フォルダ構成

サンプル的に数フォルダとファイル作りました。

PS C:\Users\masashi\7ziptest> ls -r


    ディレクトリ: C:\Users\masashi\7ziptest


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/10/03     12:47                folder1
d-----       2020/10/03     12:48                folder2


    ディレクトリ: C:\Users\masashi\7ziptest\folder1


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/10/03     12:47             24 file1.txt
-a----       2020/10/03     12:47             24 file2.txt


    ディレクトリ: C:\Users\masashi\7ziptest\folder2


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/10/03     12:48             24 file3.txt
  • 圧縮

コマンドaで圧縮です。
スイッチは-pでパスワードをかけられます。
-pの後に文字列を対話無しでかけられますが、履歴に残るし定期的にやるわけでもないので手動入力にしました。

archive.zipという名前で固めます。
コマンドはtarとほとんど一緒ですね。

PS C:\Users\masashi\7ziptest> & 'C:\Program Files\7-Zip\7z.exe' a -p archive.zip .\folder1 .\folder2\

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive:
2 folders, 3 files, 72 bytes (1 KiB)

Creating archive: archive.zip

Add new data to archive: 2 folders, 3 files, 72 bytes (1 KiB)


Enter password (will not be echoed):

Files read from disk: 3
Archive size: 824 bytes (1 KiB)
Everything is Ok

圧縮ファイルの中身確認

コマンドlです。
Listのエルです。

PS C:\Users\masashi\7ziptest> & 'C:\Program Files\7-Zip\7z.exe' l .\archive.zip

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive for archives:
1 file, 824 bytes (1 KiB)

Listing archive: .\archive.zip

--
Path = .\archive.zip
Type = zip
Physical Size = 824

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2020-10-03 12:47:47 D....            0            0  folder1
2020-10-03 12:47:41 ....A           24           36  folder1\file1.txt
2020-10-03 12:47:47 ....A           24           36  folder1\file2.txt
2020-10-03 12:48:13 D....            0            0  folder2
2020-10-03 12:48:13 ....A           24           36  folder2\file3.txt
------------------- ----- ------------ ------------  ------------------------
2020-10-03 12:48:13                 72          108  3 files, 2 folders

解凍

解凍はファイルのみ展開するのと、パスを保持したままの展開ができます。
私はフォルダ名のまま展開という方法しかやらないので、その方法のみ記載します。

パス保持したまま展開はコマンドx、
スイッチ-spfでサブフォルダまで保持して展開できます。
-oで展開用のフォルダを作成できます。
自動で同名のまま展開できなかったのでunzipという名前にしてしまいましたが、
同じ名前にしたいなら一細工する必要がありそうです。

パスワードがあれば展開時に聞かれますので、特に引数は不要です。

PS C:\Users\masashi\7ziptest> & 'C:\Program Files\7-Zip\7z.exe' x -spf -o'unzip' .\archive.zip

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive for archives:

Extracting archive: .\archive.zip
--
Path = .\archive.zip
Type = zip
Physical Size = 824


Enter password (will not be echoed):
Everything is Ok

Folders: 2
Files: 3
Size:       72
Compressed: 824
PS C:\Users\masashi\7ziptest> ls


    ディレクトリ: C:\Users\masashi\7ziptest


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/10/03     12:47                folder1
d-----       2020/10/03     12:48                folder2
d-----       2020/10/03     12:59                unzip
-a----       2020/10/03     12:49            824 archive.zip

展開したフォルダを確認すると圧縮したものと同じですね。

PS C:\Users\masashi\7ziptest> ls -r unzip


    ディレクトリ: C:\Users\masashi\7ziptest\unzip


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/10/03     12:47                folder1
d-----       2020/10/03     12:48                folder2


    ディレクトリ: C:\Users\masashi\7ziptest\unzip\folder1


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/10/03     12:47             24 file1.txt
-a----       2020/10/03     12:47             24 file2.txt


    ディレクトリ: C:\Users\masashi\7ziptest\unzip\folder2


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/10/03     12:48             24 file3.txt

むすび

今回は7zipの圧縮、解凍のみの簡単なコマンドを見てみました。

7zipコマンドラインの情報は各サイトいろいろありますが、
意外と自分が知りたい情報が無かったので整理してみました。

パスを全て保持したまま展開というのが意外と難しく何回も失敗しました。
(展開時にフォルダだけできて、ファイルは1階層目に展開しちゃうなど。-spfで解決)

ヘルプを見るとまだまだコマンドがありますが、とりあえずは圧縮・解凍を簡単にできそうです。

あとはdateコマンドのフォーマットをうまく使って一発圧縮ツールでも作りたいですね。

参考サイト

-spf (Use fully qualified file paths) switch