1. 概要

このチュートリアルでは、Linuxのzipコマンドラインツールについて説明します。

2.  zip

zip コマンドはLinuxのコマンドラインツールであり、を使用してファイルとディレクトリのアーカイブを作成できます。 それに加えて、アーカイブを操作するための多数の機能も提供します。

2.1. インストール

DebianベースのLinuxにzipコマンドラインツールをインストールするには、パッケージマネージャーapt-getを使用できます。

$ sudo apt-get update -qq
$ sudo apt-get install -y zip

さらに、パッケージマネージャー yum を使用して、zipコマンドラインツールをRHELベースのLinuxにインストールできます。

$ sudo yum update -qq
$ sudo yum install -y zip

2.2. 一般的な構文

通常、zipコマンドは次のように表すことができます。

$ zip [options] [zipfile [files...]] [-xi list]

まず、zipコマンドはオプションのフラグのリストを受け入れます。 これらのフラグは、コマンドを実行するためのさまざまなオプションとして機能します。 次に、引数 zipfile は、アーカイブのファイル名を指定します。 次に、files引数はファイル名のリストを指定します。

最後に、オプションのフラグ -xi は、除外フィルターと包含フィルターを定義します。 さらに、このフラグのセットは、コマンドの最後に定義する必要があります。

2.3. 基本的な使用法

zip コマンドの最も簡単な使用例の1つは、いくつかのファイルのアーカイブを作成することです。 たとえば、 zip を使用して、ファイルcredentials.txtおよびstatement.txtを含むアーカイブimportant-backup.zipを作成できます。 :

$ zip important-backup.zip credentials.txt statement.txt
  adding: credentials.txt (stored 0%)
  adding: statement.txt (stored 0%)

3. アーカイブを解除せずにアーカイブコンテンツを一覧表示する

場合によっては、アーカイブを解凍せずに、アーカイブの内容を一瞥したいだけかもしれません。 これは、zipinfoおよびunzipコマンドを使用して簡単に実現できます。どちらもzipのインストールに付属しています。

zipinfo を使用してアーカイブのコンテンツを表示するには、アーカイブファイル名を唯一の引数としてコマンドを実行します。

$ zipinfo important-backup.zip
Archive:  important-backup.zip
Zip file size: 347 bytes, number of entries: 2
-rw-r--r--  3.0 unx        8 tx stor 21-May-03 11:22 credentials.txt
-rw-r--r--  3.0 unx        5 tx stor 21-May-03 11:22 statement.txt
2 files, 13 bytes uncompressed, 13 bytes compressed:  0.0%

同様に、 unzip コマンドを使用して、アーカイブのコンテンツを直接一覧表示できます。

$ unzip -l important-backup.zip
Archive:  important-backup.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        8  2021-05-03 11:22   credentials.txt
        5  2021-05-03 11:22   statement.txt
---------                     -------
       13                     2 files

フラグ-lを使用すると、コマンドはアーカイブを抽出せず、代わりにそのコンテンツのみを一覧表示します。

4. 解凍せずにアーカイブからファイルを削除する

解凍せずにアーカイブ内の一部のエントリを削除するには、フラグ-dをzipコマンドに渡すことができます。 たとえば、 zip -d を使用して、important-backup.zipアーカイブからstatement.txtファイルを削除できます。

$ zip -d important-backup.zip statement.txt
deleting: statement.txt

コマンドが戻った後、アーカイブimportant-backup.zipの内容を見てみましょう。

$ zipinfo important-backup.zip
Archive:  important-backup.zip
Zip file size: 188 bytes, number of entries: 1
-rw-r--r--  3.0 unx        8 tx stor 21-May-03 11:22 credentials.txt
1 file, 8 bytes uncompressed, 8 bytes compressed:  0.0%

ご覧のとおり、 statement.txt は、最初にアーカイブのコンテンツを抽出することなく、アーカイブから削除されています。

5. 既存のアーカイブに追加する

zip コマンドは、-gフラグを使用して既存のアーカイブに追加のエントリを追加するオプションを提供します。

たとえば、既存のアーカイブimportant-backup.zipがあるとします。

$ zipinfo important-backup.zip
Archive:  important-backup.zip
Zip file size: 188 bytes, number of entries: 1
-rw-r--r--  3.0 unx        8 tx stor 21-May-03 11:22 credentials.txt

フラグ-gzipコマンドに渡すことにより、important-backup.zipアーカイブにさらに2つのエントリを追加できます。

$ zip -g important-backup.zip bank-accounts.txt customer-details.txt
  adding: bank-accounts.txt (stored 0%)
  adding: customer-details.txt (stored 0%)

上記の例では、新しいエントリbank-accounts.txtcustomer-details.txtimportant-backup.zipに追加しています。 これで、アーカイブは合計3つのエントリで構成されます。

$ zipinfo important-backup.zip
Archive:  important-backup.zip
Zip file size: 551 bytes, number of entries: 3
-rw-r--r--  3.0 unx        8 tx stor 21-May-03 11:22 credentials.txt
-rw-r--r--  3.0 unx       17 tx stor 21-May-03 11:49 bank-accounts.txt
-rw-r--r--  3.0 unx       16 tx stor 21-May-03 11:49 customer-details.txt
3 files, 41 bytes uncompressed, 41 bytes compressed:  0.0%

指定されたアーカイブファイルがまだ存在しない場合は、zipコマンドで作成されます

存在しないアーカイブファイル名でzip-gコマンドを実行してみましょう。

$ zip -g total-new-archive.zip bank-accounts.txt customer-details.txt
        zip warning: total-new-archive.zip not found or empty
  adding: bank-accounts.txt (stored 0%)
  adding: customer-details.txt (stored 0%)

zip コマンドが警告を出力し、アーカイブtotal-new-archive.zipが見つからないことを通知していることがわかります。 それでも、bank-accounts.txtcustomer-details.txtを作成してアーカイブに入れます。

6. アーカイブの暗号化

zip コマンドを使用すると、フラグ-eを使用してアーカイブを暗号化できます。 フラグ-eを使用すると、コマンドは暗号化されたアーカイブの暗号化キーとして機能するパスワードを要求します。

アーカイブファイルencrypted-backup.zipを作成して暗号化しましょう。

$ zip -e encrypted-backup.zip bank-accounts.txt credentials.txt
Enter password:
Verify password:
  adding: bank-accounts.txt (stored 0%)
  adding: credentials.txt (stored 0%)

フラグ-eを使用すると、コマンドは暗号化のキーとして機能するパスワードの入力を求めるプロンプトを表示します。

アーカイブを解凍しようとすると、アーカイブを解凍するためのパスワードが要求されます。

$ unzip encrypted-backup.zip
Archive:  encrypted-backup.zip
[encrypted-backup.zip] bank-accounts.txt password:

ただし、パスワードを知らなくても、zipinfoやunzipなどのツールを使用して暗号化されたアーカイブのコンテンツを一覧表示できます

$ zipinfo encrypted-backup.zip
Archive:  encrypted-backup.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       17  2021-05-03 11:49   bank-accounts.txt
        8  2021-05-03 11:22   credentials.txt
---------                     -------
       25                     2 files

ご覧のとおり、コンテンツリストを読み込もうとしても、パスワードの入力を求められることはありません。

7. サブディレクトリを再帰的にトラバースする

デフォルトでは、zipコマンドはディレクトリを再帰的にアーカイブしません。 フラグ-rを使用すると、zipはサブディレクトリを再帰的にトラバースし、それらのファイルをアーカイブします

たとえば、いくつかの秘密ファイルを含むディレクトリprod-secretがあるとします。

$ ls prod-secret
kafka-passwd.secret  mongo-passwd.secret  mysql-passwd.secret

prod-secret ディレクトリ全体のアーカイブを作成するには、フラグ-rを指定してzipコマンドを実行します。

$ zip -r prod-secret.zip prod-secret
  adding: prod-secret/ (stored 0%)
  adding: prod-secret/mysql-passwd.secret (stored 0%)
  adding: prod-secret/mongo-passwd.secret (stored 0%)
  adding: prod-secret/kafka-passwd.secret (stored 0%)

オプション-rを指定してコマンドを実行すると、ディレクトリ内のファイルも確実に含まれます。

ただし、 zip コマンドは、フラグ-rのないprod-secretディレクトリ内のファイルを無視します。

$ zip prod-secret prod-secret
  adding: prod-secret/ (stored 0%)

8. ファイルパターンの包含と除外

zip コマンドを使用すると、ファイルを含めたり除外したりするフィルターを作成できます。 さらに、これらのフィルターはグロブパターンで定義されています。 さらに、これらのフィルターは、作成、削除、または更新モードのいずれかで使用できます。

次のディレクトリで作業しているとしましょう。

$ tree -a
.
|-- .git
|   |-- HEAD
|   |-- branch
|   `-- tag
|-- credentials.txt
|-- customer-details.txt
`-- prod-secret
    |-- .git
    |   |-- HEAD
    |   `-- branch
    |-- kafka-passwd.secret
    |-- mongo-passwd.secret
    `-- mysql-passwd.secret

3 directories, 10 files

tree コマンドを使用して、ディレクトリの構造をグラフ形式で表示します。 ご覧のとおり、現在のディレクトリには .git サブフォルダーがあり、prod-secretディレクトリには1つあります。

8.1. パターンに一致するファイルとフォルダを含む

フラグ-iを使用して、包含フィルターを作成できます。 包含フィルターを定義する場合、zipコマンドはフィルターパターンに一致するファイルのみを考慮します。

.gitサブフォルダーのみで構成されるアーカイブonly-git.zipを作成しましょう。

$ zip -r only-git.zip . -i *.git*
  adding: prod-secret/.git/ (stored 0%)
  adding: prod-secret/.git/branch (stored 0%)
  adding: prod-secret/.git/HEAD (stored 0%)
  adding: .git/ (stored 0%)
  adding: .git/tag (stored 0%)
  adding: .git/branch (stored 0%)
  adding: .git/HEAD (stored 0%)

出力から、zipコマンドはglobに一致するフォルダーとファイルのみをアーカイブすることがわかります。

8.2. パターンに一致するファイルとフォルダを除外する

除外フィルターを作成するには、フラグ-xの後にグロブパターンを使用できます。 除外フィルターを使用すると、zipはパターンに一致するファイルを除外します。 特に、 zip -x を使用して、.gitフォルダーを除外するアーカイブを作成できます。

$ zip -r no-git.zip . -x *.git*
  adding: prod-secret/ (stored 0%)
  adding: prod-secret/mysql-passwd.secret (stored 0%)
  adding: prod-secret/mongo-passwd.secret (stored 0%)
  adding: prod-secret/kafka-passwd.secret (stored 0%)
  adding: customer-details.txt (stored 0%)
  adding: credentials.txt (stored 0%)

出力からわかるように、コマンドは.gitフォルダーのいずれもアーカイブno-git.zipに追加しませんでした。

8.3. パス評価に関する注意

zipがファイルとディレクトリのパスの包含と除外を評価するときは常に、完全な相対パスを評価します。 つまり、globパターンが .git * の場合、結果のアーカイブは空になります。

$ zip -r only-git.zip . -i .git*
        zip warning: zip file empty

これは、現在の作業ディレクトリの.gitフォルダーの正確なパスが./。git/であり、グロブパターン .git*[X158Xと一致しないためです。 ]。 同様に、prod-secretディレクトリ内の.gitフォルダの完全な相対パスは./prod-secret / .git ですが、これもそうではありません。グロブパターンに一致します。 したがって、どちらのフォルダもアーカイブに追加されません。

9. 進行状況出力メッセージのフォーマット

デフォルトでは、 zip コマンドは、標準出力を介して操作の進行状況を報告します。 この出力をカスタマイズするために利用できるいくつかのオプションがあります。

9.1. 進捗出力の抑制

フラグ-qを使用すると、zipコマンドが出力メッセージを表示しないようにすることができます

$ zip -q -r all.zip .

ご覧のとおり、フラグ -q が存在する場合、zipコマンドは進行状況メッセージを出力しません。

9.2. 進行状況をバイト単位で表示する

アーカイブするバイト数で進行状況の出力を表示するには、フラグ-dbを渡すことができます。

$ zip -r -db all.zip .
[   0/  91]   adding: prod-secret/ (stored 0%)
[   0/  91]   adding: prod-secret/mysql-passwd.secret (stored 0%)
[  13/  78]   adding: prod-secret/mongo-passwd.secret (stored 0%)
[  26/  65]   adding: prod-secret/kafka-passwd.secret (stored 0%)
[  39/  52]   adding: prod-secret/.git/ (stored 0%)
[  39/  52]   adding: prod-secret/.git/branch (stored 0%)
[  46/  45]   adding: prod-secret/.git/HEAD (stored 0%)
[  51/  40]   adding: customer-details.txt (stored 0%)
[  67/  24]   adding: credentials.txt (stored 0%)
[  75/  16]   adding: .git/ (stored 0%)
[  75/  16]   adding: .git/tag (stored 0%)
[  79/  12]   adding: .git/branch (stored 0%)
[  86/   5]   adding: .git/HEAD (stored 0%)

フラグ-dbを使用すると、 zip コマンドは、進行状況の出力の前に2つの数字を含む角かっこを付けます。 左側の数字はアーカイブされたバイト数を表し、右側の数字はアーカイブされる残りのバイト数を示します。

9.3. カウントの進捗状況の表示

または、オプションフラグ-dc を使用して、ファイルとディレクトリ数の観点から進行状況を表示することもできます。

$ zip -r -dc all.zip .
  0/ 13 updating: prod-secret/ (stored 0%)
  1/ 12 updating: prod-secret/mysql-passwd.secret (stored 0%)
  2/ 11 updating: prod-secret/mongo-passwd.secret (stored 0%)
  3/ 10 updating: prod-secret/kafka-passwd.secret (stored 0%)
  4/  9 updating: prod-secret/.git/ (stored 0%)
  5/  8 updating: prod-secret/.git/branch (stored 0%)
  6/  7 updating: prod-secret/.git/HEAD (stored 0%)
  7/  6 updating: customer-details.txt (stored 0%)
  8/  5 updating: credentials.txt (stored 0%)
  9/  4 updating: .git/ (stored 0%)
 10/  3 updating: .git/tag (stored 0%)
 11/  2 updating: .git/branch (stored 0%)
 12/  1 updating: .git/HEAD (stored 0%)

左側の数字はこれまでにアーカイブされたファイルの数を示し、右側の数字はアーカイブを待機しているファイルの数を示しています。

10. ファイルとフォルダをアーカイブに移動する

オプション-mを指定すると、zipコマンドはファイルとディレクトリをアーカイブに移動します。 つまり、アーカイブされたファイルとフォルダは削除されます

私たちのディレクトリでオプション-mを指定してzipコマンドを実行してみましょう。

$ ls
credentials.txt   customer-details.txt  prod-secret
$ zip -m backup.zip credentials.txt
  adding: credentials.txt (stored 0%)
$ ls
backup.zip  customer-details.txt  prod-secret

ご覧のとおり、ファイルcredentials.txtをアーカイブbackup.zipに移動すると、ファイルcredentials.txtが削除されます。

11. アーカイブの更新

zipコマンドは、フラグ-fによるフレッシュモードもサポートします。 このモードでは、zipコマンドは新しいファイルをアーカイブに追加しません。 代わりに、アーカイブ内のファイルのみを更新します。

たとえば、現在のディレクトリには、アーカイブcredentials-archive.zipとその他のいくつかのファイルが含まれています。

$ ls -l
total 16
-rw-r--r-- 1 david david    17 May  3 21:22 credentials.txt
-rw-r--r-- 1 david david   197 May  3 21:23 credentials-archive.zip
-rw-r--r-- 1 david david    16 May  3 16:17 customer-details.txt
drwxr-xr-x 3 david david  4096 May  3 16:17 prod-secret

さらに、アーカイブcredentials-archive.zipにはファイルcredentials.txtのみが含まれています。

$ zipinfo credentials-archive.zip
Archive:  credentials-archive.zip
Zip file size: 197 bytes, number of entries: 1
-rw-r--r--  3.0 unx       17 tx stor 21-May-03 21:22 credentials.txt
1 file, 17 bytes uncompressed, 17 bytes compressed:  0.0%

次に、 credentials.txt ファイルに新しい行を追加して、ファイルを変更しましょう。

$ echo "id=1234;password=4321" >> credentials.txt
$ ls -l credentials.txt
-rw-r--r-- 1 root root 39 May  3 21:27 credentials.txt

ファイルcredentials.txtのタイムスタンプとサイズの両方が更新されていることに注意してください。

これで、 zip コマンドを更新モードで実行して、アーカイブ内のcredentials.txtファイルを更新できます。

$ zip -r -f credentials-archive.zip .
freshening: credentials.txt (deflated 5%)

コマンドでフラグ-rを指定しましたが、アーカイブに追加の新しいファイルを取り込むことはありません。 これは、フレッシュモードを使用すると、zipコマンドがアーカイブに新しいファイルを追加しないためです。 コマンドをフレッシュモードで実行していなかった場合、zipコマンドにはアーカイブ内の現在のディレクトリにあるすべてのものが含まれていました。

更新されたcredentials-archive.zipアーカイブを見てみましょう。

$ zipinfo credentials-archive.zip
Archive:  credentials-archive.zip
Zip file size: 217 bytes, number of entries: 1
-rw-r--r--  3.0 unx       39 tx defN 21-May-03 21:27 credentials.txt
1 file, 39 bytes uncompressed, 37 bytes compressed:  5.1%

ご覧のとおり、zipコマンドはアーカイブ内のファイルを最新バージョンに更新します。 さらに、同じディレクトリ内の残りのファイルは含まれません。

12. 結論

このチュートリアルでは、zipコマンドラインツールを詳しく調べました。

構文構造と基本的な使用法とともに、基本的なインストールガイドから始めました。 次に、解凍せずにアーカイブのコンテンツを覗くためのツールを紹介しました。

次に、既存のアーカイブを変更できるいくつかのオプションを示しました。 さらに、再帰フラグや包含と除外のフィルターの使用など、アーカイブの作成に関連するいくつかのオプションも示しました。

それ以外に、zipコマンドによって生成される進行状況出力を変更するためのさまざまなオプションを見てきました。 最後に、zipコマンドによって提供されるフレッシュモードについて見てきました。