Linuxでファイル、ディレクトリを圧縮してzipファイルを作成する方法

公開日:2019/10/11 更新日:2019/10/11
Linuxでファイル、ディレクトリを圧縮してzipファイルを作成する方法のサムネイル

はじめに

Linuxでファイルやディレクトリを圧縮してzipファイルを作成するには、zipコマンドを使用します。この記事では、zipコマンドの使い方をまとめます。特にパスワード保護してzip化する場合は注意が必要なのでその点もまとめます。 なお、zipファイルの解凍については以下に別途まとめています。

www.virment.com

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ファイル自体はパスワード無しに開くことができてしまいます。あくまでも各ファイルがパスワード保護されている状態です。

zippedfile.png

これは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での質問と回答を元にしています。

unix.stackexchange.com

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ファイルの扱いはほぼ問題ないと思います。パスワード保護付きの場合だけ少し注意が必要です。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。