【Linux】zipコマンドで複数のファイルをまとめて圧縮・暗号化する

目次

概要

Windows環境などとのデータ受け渡しにおいて、最も互換性が高く標準的に利用される「ZIP形式」でファイルを圧縮・アーカイブするためのコマンドです。

ディレクトリ構造を保ったまま複数のファイルを一つにまとめたり、パスワードをかけて簡易的なセキュリティ対策を行う際に重宝します。

仕様(引数・オプション)

構文

zip [オプション] [生成するZIPファイル名] [対象ファイル...]

主な引数・オプション

オプション説明
-rディレクトリを再帰的にたどり、配下のファイルもすべて圧縮します。
-eファイルを暗号化し、展開時にパスワードを要求するようにします。
-P [パスワード]コマンドラインでパスワードを直接指定します(履歴に残るため非推奨)。
-x [ファイル]特定のファイルを圧縮対象から除外します。
-@標準入力からファイル名のリストを受け取って圧縮します。
-u既存のZIPファイルに、新しいファイルを追加または更新します。
-d既存のZIPファイルから、指定したファイルを削除します。
-m圧縮完了後に、元のファイルを削除します(移動)。
-q実行時のメッセージ出力を抑制します(Quietモード)。
-c各ファイルに1行コメントを付けます。
-zZIPアーカイブ全体にコメントを付けます。

基本の使い方

ディレクトリ(ここでは project_docs)を丸ごと圧縮し、docs_archive.zip というファイルを作成します。ディレクトリ内の構造を維持するには -r オプションが必須です。

# ディレクトリを再帰的に圧縮
zip -r docs_archive.zip project_docs/

実行結果例

  adding: project_docs/ (stored 0%)
  adding: project_docs/spec.pdf (deflated 12%)
  adding: project_docs/readme.txt (deflated 45%)
  adding: project_docs/images/logo.png (stored 0%)

実践コマンド

特定のファイルを除外して圧縮する

ログファイルやGit管理ディレクトリなど、不要なファイルを含めたくない場合は -x オプションを使用します。

# .gitディレクトリと .logファイルを除外して圧縮
zip -r release_package.zip my_app/ -x "*.git*" "*.log"

findコマンドの結果をパイプで渡して圧縮する

複雑な条件(更新日時やファイルサイズなど)でファイルを絞り込みたい場合、find コマンドでリストを作成し、-@ オプションで zip に渡します。

# 7日以内に更新された .csv ファイルのみを検索して圧縮
find ./data -name "*.csv" -mtime -7 | zip -@ recent_data.zip

圧縮ファイルにパスワードをかける

-e オプションを指定すると、対話モードでパスワードの設定が求められます。

# 全てのテキストファイルを暗号化して圧縮
zip -e secret_notes.zip *.txt

実行結果例

Enter password: 
Verify password: 
  adding: memo.txt (deflated 21%)
  adding: todo.txt (deflated 15%)

※展開(解凍)する際は unzip secret_notes.zip を実行するとパスワードが求められます。

カスタムポイント

  • アーカイブへのコメント追加 (-z)圧縮ファイル自体に説明文(メタデータ)を付与できます。バージョン情報などを残すのに便利です。Bashzip -z backup_v1.zip # 入力プロンプトが表示されるので、コメントを入力して Ctrl+D で終了 確認には unzip -l 等を使用します。
  • ファイルごとのコメント追加 (-c)格納される個々のファイルにコメントをつけたい場合に使用します。Bashzip -c archive.zip file1.txt

注意点

  1. ディレクトリ圧縮時の -r 忘れzip archive.zip directory/ と実行すると、ディレクトリの中身が空の状態で圧縮されてしまうことがあります(空の器だけができる)。必ず -r をつけてください。
  2. 絶対パスでの圧縮/var/log/syslog のように絶対パスで指定すると、展開時にもディレクトリ階層がそのまま再現され、意図しない場所にファイルが展開されるリスクがあります。通常は圧縮したいディレクトリに移動(cd)してから、相対パスで実行することを推奨します。
  3. パスワードの安全性zip コマンドの標準的な暗号化(ZipCrypto)は、現代の解析技術では比較的容易に突破される可能性があります。高度な機密性を要する場合は、gpg コマンドや 7z (AES-256) の利用を検討してください。

応用

既存のZIPファイルのメンテナンス(追加・削除)

一度作成したZIPファイルを解凍せずに、中身を直接編集するコマンドです。

# 既存の archive.zip に new_file.txt を追加(または更新)
zip -u archive.zip new_file.txt

# 既存の archive.zip から old_file.txt を削除
zip -d archive.zip old_file.txt

まとめ

zip コマンドは、LinuxだけでなくWindowsやMacなど異なるOS間でファイルをやり取りする際に最もトラブルが少ない形式を作成できます。

「再帰的な -r」と「除外の -x」を組み合わせることで、必要なファイルだけをクリーンにパッケージングするスキルは、配布用データの作成やバックアップ処理において非常に重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次