Linuxでファイル、ディレクトリを圧縮してzipファイルを作成する方法
はじめに
Linuxでファイルやディレクトリを圧縮してzipファイルを作成するには、zip
コマンドを使用します。この記事では、zip
コマンドの使い方をまとめます。特にパスワード保護してzip化する場合は注意が必要なのでその点もまとめます。
なお、zipファイルの解凍については以下に別途まとめています。
Linuxでzipファイルを扱いたい場面はたまにあると思います。ファイルブラウザなどで目的のzipファイル上で右クリックして「ここてで展開する」などすれば解凍できますが、端末から解凍したい場合はunzipコマンドを使用するのが簡単です。この記事では、unzipを使う手順をまとめます。
前提と環境
ここではUbuntu18.04を使用します。ディストリビューションによってインストールのために使用するパッケージマネージャが異なるだけで基本的な使い方は同じになります。
- OS : Ubuntu 18.04
zipをインストールする
Ubuntu18.04では、デフォルトでzip
コマンドはインストールされていないため、以下でインストールします。
$ sudo apt install zip
ちなみに、CentOSではyum
を使います。
$ sudo yum install zip
ファイルからzipファイルを作成する
最もシンプルな使い方は以下です。以下は1つのファイルだけをzipファイルにします。
$ zip myzip myfile.txt
上記を実行すると、myzip.zip
というzipファイルが作成されます。元のファイルは残ります。
$ ls
myfile.txt myzip.zip
以下のように、複数のファイルをzip
コマンドの引数として渡せば、まとめて1つのzipファイルを作成してくれます。
$ zip myzip myfile.txt myfile_2.txt myPhoto.png
上記を実行すると、同じくmyzip.zip
というzipファイルが作成されますが、unzip
コマンドなどで解凍すれば当然ながらmyfile.txt myfile_2.txt myPhoto.png
それぞれが展開されます。
ちなみに、以下のように正規表現を使ってまとめてzip化することももちろん可能です。
$ zip myzip *.txt *.png
ディレクトリからzipファイルを作成する
ディレクトリからzipファイルを作成することももちろんできます。例えば、以下のようなzipdir
という名前のディレクトリがあるとします。
$ ls zipdir
myfile.txt myfile_2.txt myPhoto.png
上記のディレクトリzipdir
を以下のように-r
オプションを与えてzipファイルを作成できます。
$ zip -r mydirzip zipdir
上記を実行すると、現在のディレクトリにmydirzip.zip
が作成されます。
ちなみに、ディレクトリの中にディレクトリがあるような階層が1以上のディレクトリも上記と全く同じように-r
オプションを付けてzipファイルを作成できます。
ただし、注意点として、解凍するとzip化する前の元々のディレクトリ名を持つディレクトリが作成されます。つまり、上記の例では、mydirzip.zip
を解凍すると、そこにはzipdir
という元々のディレクトリ名を持つディレクトリが作成されます。
なお、以下のようにファイルとディレクトリを混ぜてzip化も問題なく可能です。
$ zip -r mydirzip zipdir myfile.txt myfile_2.txt myPhoto.png
元ファイルを削除してzipファイルを作成する
以下のように-m
オプションを使用すると、元々のファイルを削除してzipファイルを作成します。
$ zip -m myzip myfile.txt myfile_2.txt myPhoto.png
上記を実行すると、myzip.zip
が作成されて、myfile.txt myfile_2.txt myPhoto.png
は元のディレクトリから削除されます。すなわち以下のようになります。
$ ls
myzip.zip
パスワード付きzipファイルを作成する
-e
オプションを使用します。パスワードを2回確認されるので入力します。ただし、以下の方法だとファイル単位でパスワード保護されますが、ファイル名は誰でも確認できてしまいます。回避方法は後述します。
$ zip -e protected myfile.txt myfile_2.txt myPhoto.png
Enter password:
Verify password:
adding: myfile.txt (deflated 27%)
adding: myfile_2.txt (deflated 27%)
adding: myPhoto.png (deflated 27%)
上記の方法でパスワード付きでzip化すると、以下のようにGUIにてzipファイル自体はパスワード無しに開くことができてしまいます。あくまでも各ファイルがパスワード保護されている状態です。
これはzipの仕様による制限のためで、zip
コマンド自体のオプションなどでは回避できません。そこで、以下のように一度パスワード保護なし、圧縮なしでzipファイルを作成し、それを新たにパスワード保護することでファイル名を表示させることもなくパスワード保護できます。
$ zip -0 -r myzip secretdir
$ zip -e -n : protected myzip.zip
上記の1行目では、secretdir
という名前のディレクトリから、-0
を付けて圧縮率0,すなわち圧縮無しでmyzip
という名前のzipファイルを作成します。
その後、2行目では、-e
オプションでパスワード保護を指定し、さらに-n :
では、拡張子が.zip
のzipファイルも含めて全て圧縮対象とするよう指定しています。zip
コマンドでは、デフォルトでは.zip
を圧縮対象としないため、この-n :
を使用します。
なお、最初から1行目で圧縮率を0にせずに通常通り圧縮してもOKですが、最後の工程(上記の場合は2行目)で圧縮した方が最終的な圧縮率がよくなります。
これらについては、以下のStackExchangeでの質問と回答を元にしています。
Using command line, I know that I can encrypt a directory with the following command:zip -er Directory.zip /path/to/directory However, this does not encrypt the filenames themselves. If someone ...
上記の方法で作成されたzipファイルは、パスワード入力自体は1度で済むため、解凍する側の負担も特に増えません。
オプションをまとめて使用する
以下のように上記のオプションをまとめて使用もできます。
$ zip -rme myzip zipdir myfile.txt *.png
zip
コマンドには他にもオプションがあります。-h
でその他のオプションを確認できます。
$ zip -h
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete OS files)
-r recurse into directories -j junk (dont record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-e encrypt -n dont compress these suffixes
-h2 show more help
まとめ
zipとunzipでzipファイルの扱いはほぼ問題ないと思います。パスワード保護付きの場合だけ少し注意が必要です。
関連記事
- 公開日:2020/02/16 更新日:2020/02/16
圧縮、暗号化、リモート対応の差分バックアップを作成できる「Borg Backup」の使い方
圧縮、暗号化に対応し差分バックアップを作成できるソフトウェアである「Borg Backup」をUbuntuにインストールして使ってみたのでその手順をまとめます。「Borg Backup」はLinux、macOSに対応しています。
- 公開日:2020/02/14 更新日:2020/02/14
自分専用の後で読むサービスを構築できる「Wallabag」をUbuntu + Nginxで構築する手順
後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。
- 公開日:2020/02/12 更新日:2020/02/12
ファイル単位で暗号化して保存できるCryptomatorをインストールして使う手順
Cryptomatorは、ファイル単位での暗号化が可能なソフトウェアです。この記事では、UbuntuにCryptomatorをインストールする手順と使い方をまとめます。
- 公開日:2020/01/22 更新日:2020/01/22
WireGuardでVPNサーバーを構築してスマホやPCから接続する手順
WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。
- 公開日:2020/01/17 更新日:2020/01/17
ディレクトリ表示や移動をインタラクティブに実行できるコマンドツール「Broot」
Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。Brootはディレクトリ構造を表示しつつさらにそこから各ディレクトリに移動したりファイルを検索したりできるコマンドラインツールです。