LinuxでのZipコマンドの操作
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
フラグ-gをzipコマンドに渡すことにより、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.txtとcustomer-details.txtをimportant-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.txtとcustomer-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/であり、グロブパターン
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コマンドによって提供されるフレッシュモードについて見てきました。