zip は複数のファイルを1つにまとめて圧縮するコマンド、unzip はその ZIP ファイルを展開(解凍)するコマンドです。 ディレクトリごと圧縮するなら zip -r 名前.zip ディレクトリ、展開するなら unzip 名前.zip が基本形です。ZIP は Windows や macOS でも標準で開けるため、OS をまたいでファイルを受け渡すときに重宝します。

この記事では、Ubuntu 24.04(Info-ZIP の Zip 3.0、UnZip 6.00、7-Zip 23.01)で実際にコマンドを動かし、出力をそのまま載せています。用途別のコピペ表に加えて、パスワード指定の -e と -P で何が違うのかを ps とシェルの履歴で確認し、暗号方式の違い(ZipCrypto と AES-256)、Windows で作った ZIP の日本語ファイル名が文字化けするケースを unzip -O cp932 で直す前後まで扱います。

zip・unzipの早見表(用途別コピペ表)

やりたいこと コマンド ポイント
ファイルを圧縮 zip out.zip memo.txt 元ファイルは残る
複数ファイルを圧縮 zip out.zip a.txt b.txt 並べて書く
ディレクトリごと圧縮 zip -r docs.zip docs -r が必要
一部を除外して圧縮 zip -r docs.zip docs -x '*.log' 'docs/tmp/*' パターンは引用符で囲む
進行表示を出さない zip -rq docs.zip docs -q は quiet
既存の ZIP に追加 zip docs.zip add.txt 同じコマンドで追加になる
変更されたものだけ更新 zip -u docs.zip memo.txt 新しいファイルだけ入れ替え
ZIP の中から削除 zip -d docs.zip docs/debug.log 展開せずに削除
圧縮率を上げる zip -9 -r docs.zip docs -0(無圧縮)〜-9(最高)
分割して圧縮 zip -s 200k -r split.zip big.txt .z01 .z02 … と .zip ができる
パスワードを付ける zip -e -r secret.zip docs パスワードを対話で入力
中身を一覧 unzip -l docs.zip 展開はしない
壊れていないかテスト unzip -t docs.zip -tq で結果だけ
展開(カレントへ) unzip docs.zip
展開先を指定 unzip docs.zip -d out ディレクトリは自動で作られる
確認なしで上書き unzip -o docs.zip -d out o は overwrite
既存ファイルは飛ばす unzip -n docs.zip -d out n は never overwrite
一部だけ展開 unzip docs.zip 'docs/*.csv' -d part パターンは引用符で囲む
中身を画面に出す unzip -p docs.zip docs/a.txt ファイルを作らず標準出力へ
日本語名の文字化けを直す unzip -O cp932 win.zip Windows 作成の ZIP 向け

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「zip・unzipコマンドの使い方|圧縮・解凍・パスワード・文字化け」

zip・unzip のインストール方法

最小構成の環境では入っていないことがあります。zip -v や unzip -v でバージョンが出れば、すでに使えます。

OS インストールコマンド
Ubuntu / Debian sudo apt update && sudo apt install -y zip unzip
RHEL / AlmaLinux / Rocky Linux / Fedora sudo dnf install -y zip unzip
Amazon Linux 2023 sudo dnf install -y zip unzip
Alpine Linux apk add zip unzip
macOS 標準で入っている
zip -v | sed -n '2p'
unzip -v | head -1
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.

Info-ZIP の zip・unzip は長く同じ版(3.0 と 6.00)が使われており、各ディストリビューションが修正を加えて配布しています。入っていないときは、次のようなメッセージが出ます(メッセージは Ubuntu の一般的な表示)。

Command 'zip' not found, but can be installed with:
sudo apt install zip

zip で圧縮する

以降の例は、次のファイルで実行しています。

mkdir -p docs/img docs/tmp
echo "hello" > docs/a.txt
seq 1 2000 > docs/b.csv
echo png > docs/img/logo.png
echo t > docs/tmp/cache.tmp
echo log > docs/debug.log
echo memo > memo.txt

ファイルを圧縮する

zip one.zip memo.txt
  adding: memo.txt (stored 0%)

書式は zip 作るZIPの名前 入れるファイル… です。stored 0% は「圧縮せずそのまま格納した」という意味で、小さすぎて圧縮の効果がないファイルで表示されます。圧縮されたときは deflated 53% のように、減った割合が出ます。

ディレクトリごと圧縮する(-r)

zip -r docs.zip docs
  adding: docs/ (stored 0%)
  adding: docs/img/ (stored 0%)
  adding: docs/img/logo.png (stored 0%)
  adding: docs/debug.log (stored 0%)
  adding: docs/tmp/ (stored 0%)
  adding: docs/tmp/cache.tmp (stored 0%)
  adding: docs/b.csv (deflated 53%)
  adding: docs/a.txt (stored 0%)

-r(recursive)を付けないと、ディレクトリの中身が入りません。 付けずに実行した結果です。

zip nor.zip docs
unzip -l nor.zip
  adding: docs/ (stored 0%)
Archive:  nor.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2026-10-02 09:35   docs/
---------                     -------
        0                     1 file

空のディレクトリ1つだけが入った ZIP になりました。エラーは出ないので、圧縮後に unzip -l で中身を確かめる習慣を付けておくと安心です。

一部を除外して圧縮する(-x)

zip -r ex.zip docs -x '*.log' 'docs/tmp/*'
  adding: docs/ (stored 0%)
  adding: docs/img/ (stored 0%)
  adding: docs/img/logo.png (stored 0%)
  adding: docs/b.csv (deflated 53%)
  adding: docs/a.txt (stored 0%)

debug.log と docs/tmp/ 以下が外れました。パターンを引用符で囲むのがコツです。囲まないとシェルが先に * を展開してしまい、意図と違う結果になることがあります。

除外したいもの 書き方
拡張子で除外 -x '*.log'
特定ディレクトリ以下 -x 'docs/tmp/*'
Git の管理情報 -x '*.git*'
node_modules -x '*/node_modules/*'
macOS の付随ファイル -x '*.DS_Store' '__MACOSX/*'
逆に、含めるものを指定 -i '*.csv'(-x の反対)

既存の ZIP に追加・更新・削除する

echo new > add.txt
zip docs.zip add.txt            # 追加
zip -d docs.zip docs/debug.log  # ZIP の中から削除
  adding: add.txt (stored 0%)
deleting: docs/debug.log

zip は、同じ名前の ZIP がすでにあれば「追加」になります。作り直したいときは、先に既存の ZIP を削除するか、別名で作ります。-u(update)は、ZIP の中より新しいファイルだけを入れ替えます。

echo changed2 >> memo.txt
zip -u one.zip memo.txt
zip -u one.zip memo.txt; echo "exit=$?"
updating: memo.txt (deflated 23%)
exit=12

1回目は更新され、2回目は更新するものがないため何も表示されず、終了ステータス12(何もすることがなかった)が返りました。

オプション 動き
(なし) 追加。同名のファイルは置き換え
-u ZIP 内より新しいファイルだけ更新、無いものは追加
-f ZIP 内にすでにあるファイルだけを更新(新規追加はしない)
-d ZIP 内のファイルを削除
-m ZIP に入れたあと、元ファイルを削除(移動)

圧縮レベルを変える(-0〜-9)

zip -q -0 l0.zip docs/b.csv
zip -q -6 l6.zip docs/b.csv
zip -q -9 l9.zip docs/b.csv
ls -l docs/b.csv l0.zip l6.zip l9.zip | awk '{print $5, $9}'
8893 docs/b.csv
9063 l0.zip
4370 l6.zip
4370 l9.zip

-0 は無圧縮(格納のみ)で、管理情報の分だけ元より大きくなります。既定は -6 です。この例のような小さなファイルでは -6 と -9 が同じサイズでした。画像や動画など、すでに圧縮されているファイルは -0 でまとめるだけにすると処理が速く済みます。

分割して圧縮する(-s)

seq 1 400000 > big.txt          # 約2.7MB
zip -s 200k tsplit.zip big.txt
ls -l tsplit.z* | awk '{print $5, $9}'
  adding: big.txt (deflated 68%)
204800 tsplit.z01
204800 tsplit.z02
204800 tsplit.z03
204800 tsplit.z04
34609 tsplit.zip

-s サイズ で、指定サイズごとに .z01、.z02 … と分かれ、最後が .zip になります。単位は k・m・g が使えます。Info-ZIP の unzip は分割 ZIP をそのまま展開できないため、先に1つへまとめます。

zip -q -s 0 tsplit.zip --out tjoined.zip   # 分割を解除して1つにまとめる
unzip -tq tjoined.zip
No errors detected in compressed data of tjoined.zip.

-s 0 が「分割しない」という指定で、--out で出力先を別名にします。なお 7-Zip(7z x tsplit.zip)は、分割 ZIP を直接読めます(7z t でテストし Everything is Ok を確認)。

ファイル一覧を渡して圧縮する

find docs -name '*.txt' | zip -q -@ txt.zip

-@ は、入れるファイル名を標準入力から受け取る指定です。find で条件を付けて選んだファイルだけをまとめたいときに使えます。

unzip で展開(解凍)する

中身を一覧する(-l)

unzip -l docs.zip
Archive:  docs.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2026-10-02 09:35   docs/
        0  2026-10-02 09:35   docs/img/
        4  2026-10-02 09:35   docs/img/logo.png
        0  2026-10-02 09:35   docs/tmp/
        2  2026-10-02 09:35   docs/tmp/cache.tmp
     8893  2026-10-02 09:35   docs/b.csv
        6  2026-10-02 09:35   docs/a.txt
        4  2026-10-02 09:35   add.txt
---------                     -------
     8909                     8 files

展開する前に -l で中身を見ると、「トップにディレクトリがあるか、ファイルが直接並んでいるか」が分かります。ファイルが直接並ぶ ZIP をそのまま展開すると、カレントディレクトリに散らばるので、次の -d で展開先を決めると片付けが楽です。

ファイル名だけ欲しいときは unzip -Z1 docs.zip、権限や圧縮方式まで見たいときは zipinfo docs.zip が使えます。

Archive:  docs.zip
Zip file size: 5432 bytes, number of entries: 8
drwxr-xr-x  3.0 unx        0 bx stor 26-Oct-02 09:35 docs/
drwxr-xr-x  3.0 unx        0 bx stor 26-Oct-02 09:35 docs/img/

壊れていないかテストする(-t)

unzip -t one.zip
unzip -tq docs.zip; echo "exit=$?"
Archive:  one.zip
    testing: memo.txt                 OK
No errors detected in compressed data of one.zip.
No errors detected in compressed data of docs.zip.
exit=0

-t は実際に展開せず、データを読んで整合性を確かめます。大きな ZIP を転送したあとの確認に向いています。

展開先を指定する(-d)

unzip -q docs.zip -d out
ls out out/docs
out:
add.txt
docs

out/docs:
a.txt
b.csv
img
tmp

-d で指定したディレクトリは、無ければ自動で作られます。-q は進行表示を省くオプションです。

上書きの動きを決める(-o と -n)

同じ場所へもう一度展開すると、unzip は1ファイルごとに確認を求めます。

replace out/docs/img/logo.png? [y]es, [n]o, [A]ll, [N]one, [r]ename:
入力 動き
y このファイルを上書き
n このファイルは飛ばす
A 以降すべて上書き
N 以降すべて飛ばす
r 別名を付けて展開

スクリプトでは質問で止まらないよう、あらかじめ決めておきます。

unzip -o -q docs.zip -d out   # すべて上書き
unzip -n -q docs.zip -d out   # 既存のファイルはそのまま残す

どちらも終了ステータス0で、質問なしに完了しました。-o は overwrite、-n は never overwrite と覚えられます。

一部だけ展開する・中身を画面に出す

unzip docs.zip 'docs/*.csv' -d part
unzip -p docs.zip docs/a.txt
Archive:  docs.zip
  inflating: part/docs/b.csv         
hello

-p はファイルを作らず、中身を標準出力へ流します。unzip -p docs.zip docs/b.csv | head のように、パイプへつなぐ使い方ができます。

ディレクトリ構造を無視して、ファイルだけを1か所に集めたいときは -j(junk paths)です。

unzip -j -q docs.zip 'docs/img/*' -d flat
ls flat
logo.png

unzip の主なオプション

オプション 意味
-l 一覧表示(展開しない)
-t 整合性テスト
-d DIR 展開先ディレクトリ
-o 確認なしで上書き
-n 既存ファイルは上書きしない
-q 表示を少なく(-qq でさらに少なく)
-p 標準出力へ展開
-j ディレクトリ構造を作らない
-x パターン 指定したものを展開しない
-P パスワード パスワードを引数で渡す(後述の注意あり)
-O 文字コード Windows・DOS 作成 ZIP のファイル名の文字コードを指定
-I 文字コード UNIX 系作成 ZIP のファイル名の文字コードを指定

パスワード付き ZIP を作る(-e と -P の違い)

パスワードの付け方は2通りあります。結果としてできる ZIP は同じ暗号方式ですが、パスワードの渡し方が違います。

-e:対話で入力する

zip -e e.zip memo.txt
Enter password:
Verify password:
  adding: memo.txt (deflated 23%)

入力した文字は画面に表示されません(tmux の画面を取得して確認)。展開するときも、パスワードを尋ねられます。

unzip -o e.zip -d e_out
Archive:  e.zip
[e.zip] memo.txt password:
  inflating: e_out/memo.txt

-P:コマンドラインに書く

zip -P 'S3cret!' p.zip memo.txt
unzip -P 'S3cret!' -o p.zip -d pw_out
  adding: memo.txt (deflated 23%)
Archive:  p.zip
  inflating: pw_out/memo.txt

パスワードが違うときは、次のように表示されて終了ステータス82が返ります。

Archive:  p.zip
   skipping: memo.txt                incorrect password

-P はパスワードが ps と履歴に残る

-P は手軽ですが、コマンドラインに書いた文字は、同じマシンのほかの利用者からも見える場所に残ります。実際に確かめます。

まず、プロセス一覧です。大きめのファイルを圧縮している最中に、別のコマンドから ps で見てみます。

zip -q -P 'S3cret!' -r slow.zip big.bin big.txt docs &
ps -o pid,args -p $!
  PID COMMAND
 7341 zip -q -P S3cret! -r slow.zip big.bin big.txt docs

パスワードがそのまま表示されました。 ps aux は、通常ほかのユーザーのプロセスの引数も表示します。次に、シェルの履歴です。

set -o history
zip -q -P 'S3cret!' h1.zip memo.txt
history | tail -2
    2  zip -q -P 'S3cret!' h1.zip memo.txt
    3  history | tail -2

履歴にも残り、ログアウト時には ~/.bash_history に書き出されます。

比較項目 -e -P パスワード
パスワードの渡し方 対話で入力(画面に出ない) コマンドラインの引数
ps で見える 見えない 見える
シェルの履歴に残る 残らない 残る
スクリプトで自動化 向かない(入力待ちになる) できる
暗号方式 ZipCrypto ZipCrypto(同じ)
向いている場面 手作業で作るとき 共有されない環境での自動処理

手で作るときは -e を選ぶのが基本です。zip のマニュアルも、-P はコマンドラインが他者から見える環境では安全でないと説明しています。自動化でどうしても必要なときは、次の章の 7-Zip と合わせて、渡し方を検討します。

ZIP の暗号方式:ZipCrypto と AES-256

zip コマンドの暗号は ZipCrypto

zip の拡張ヘルプ(zip -h2)には、こう書かれています。

Encryption:
  -e        use standard (weak) PKZip 2.0 encryption, prompt for password
  -P pswd   use standard encryption, password is pswd

zip コマンド自身が「standard (weak)」と説明しているとおり、Info-ZIP の zip 3.0 が使えるのは、ZIP の初期からある方式(ZipCrypto、PKZIP 2.0 暗号とも呼ばれる)だけです。この方式は、ZIP の中身の一部が推測できる場合に鍵を求められる手法(既知平文攻撃)が1990年代から知られています。また、暗号化されるのはファイルの中身だけで、ファイル名は unzip -l でパスワードなしに見えます。

そのため、ZipCrypto の ZIP は「うっかり開いてしまうのを防ぐ」程度の用途と考え、守りたい情報には AES-256 を使うのが現在の定石です。

7-Zip で AES-256 の ZIP を作る

7-Zip(7z コマンド)は、AES-256 で暗号化した ZIP を作れます。

# インストール(Ubuntu 24.04 の場合。以前の版では p7zip-full)
sudo apt install -y 7zip

7z a -tzip -mem=AES256 -p aes.zip memo.txt    # -p だけ書くと対話で入力

-p の直後にパスワードを続けて書くこともできますが、zip の -P と同じく ps と履歴に残るので、-p だけにして対話で入力する形が安心です。作った ZIP の方式を確かめます。

7z l -slt p.zip   | grep -E 'Method|Encrypted'
7z l -slt aes.zip | grep -E 'Method|Encrypted'
Encrypted = +
Method = ZipCrypto Deflate
Encrypted = +
Method = AES-256 Store

zip -P で作った p.zip は ZipCrypto、7z で作った aes.zip は AES-256 と表示されました。

AES の ZIP は unzip では開けない

unzip -P 'S3cret!' -o aes.zip -d aes_out; echo "exit=$?"
Archive:  aes.zip
   skipping: memo.txt                need PK compat. v5.1 (can do v4.6)
exit=81

Info-ZIP の unzip 6.00 は AES に対応していないため、need PK compat. v5.1 と表示して飛ばします。このメッセージが出たら、7z で展開します。

7z x -oaes_out2 aes.zip      # パスワードを尋ねられる

Windows では、エクスプローラー標準の機能が AES の ZIP を開けない版があります。相手が 7-Zip などの対応ソフトを使えるかを、先に確かめておくとスムーズです。

ファイル名も隠したいなら 7z 形式

7z a -p -mhe=on enc.7z memo.txt docs

.7z 形式で -mhe=on(ヘッダー暗号化)を付けると、ファイル名の一覧もパスワードなしでは見られなくなります。違うパスワードで 7z l enc.7z を試すと、一覧は表示されず Errors: 1 で終わりました。

方式 作るコマンド 中身の暗号 ファイル名 開ける主なツール
ZIP(ZipCrypto) zip -e ZipCrypto(強度は控えめ) 見える ほぼすべて
ZIP(AES-256) 7z a -tzip -mem=AES256 -p AES-256 見える 7-Zip など対応ソフト
7z(AES-256) 7z a -p -mhe=on AES-256 隠せる 7-Zip など

なお、パスワード付きファイルとパスワードを同じ経路で続けて送ると、両方が同じ相手に届く点は変わりません。受け渡しの方法そのもの(アクセス権を設定した共有ストレージなど)も合わせて検討すると、より確かになります。

Windows で作った ZIP の日本語ファイル名が文字化けするとき

何が起きているか

ZIP のファイル名は、作った環境の文字コードで記録されることがあります。日本語版 Windows の標準機能などで作った ZIP には、ファイル名が CP932(Shift_JIS 系)で入っていて、「UTF-8 である」という目印が付いていないものがあります。Linux の unzip はそれを別の文字コードとして解釈するため、文字化けします。

再現用に、CP932 のファイル名を持つ ZIP を Python で作ります(Python 3.11)。

# mk.py : ファイル名を CP932 で格納し、UTF-8 フラグを立てない ZIP を作る
import zipfile

class SJISInfo(zipfile.ZipInfo):
    def _encodeFilenameFlags(self):
        return self.filename.encode('cp932'), self.flag_bits & ~0x800

with zipfile.ZipFile('win.zip', 'w', zipfile.ZIP_DEFLATED) as z:
    for name, body in [('見積書.txt', '見積の内容'), ('資料/議事録_10月.txt', '議事録')]:
        zi = SJISInfo(name)
        zi.create_system = 0          # 0 = DOS/Windows で作ったという印
        zi.compress_type = zipfile.ZIP_DEFLATED
        z.writestr(zi, body)

直す前:そのまま展開する

ロケールは LANG=C.UTF-8 です。

python3 mk.py
unzip -l win.zip
unzip -q win.zip -d m1; ls -R m1
Archive:  win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       15  1980-01-01 00:00   МйР╧ПС.txt
        9  1980-01-01 00:00   ОСЧ┐/ЛcОЦШ^_10МО.txt
---------                     -------
       24                     2 files
m1:
МйР╧ПС.txt
ОСЧ┐

m1/ОСЧ┐:
ЛcОЦШ^_10МО.txt

「見積書.txt」が МйР╧ПС.txt になりました。ファイルの中身は正しく展開されていて、化けているのはファイル名だけです。

直した後:unzip -O cp932

unzip -O cp932 -l win.zip
unzip -O cp932 win.zip -d m2; ls -R m2
Archive:  win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       15  1980-01-01 00:00   見積書.txt
        9  1980-01-01 00:00   資料/議事録_10月.txt
---------                     -------
       24                     2 files
Archive:  win.zip
  inflating: m2/見積書.txt        
  inflating: m2/資料/議事録_10月.txt  
m2:
見積書.txt
資料

m2/資料:
議事録_10月.txt

-O cp932 を付けるだけで、日本語のファイル名が正しく表示・展開されました。 -O は「DOS・Windows・OS/2 で作られた ZIP のファイル名の文字コード」を指定するオプションです。

お使いの unzip が -O に対応しているか確かめる

-O は Info-ZIP 本家の unzip 6.00 にはなく、ディストリビューションが加えた機能です。次のコマンドで確認できます。

unzip -h | grep -E '\-O|-I'
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives

Ubuntu 24.04 の unzip(UnZip 6.00 ... by Debian)では、上のとおり対応していました。何も表示されない環境では、次の方法が使えます。

方法 コマンド 補足
unzip の -O unzip -O cp932 win.zip Debian・Ubuntu 系で確認済み。ほかは unzip -h で確認
Python で展開 下のワンライナー Python 3.11 以降の metadata_encoding を使用
unar を使う unar win.zip 文字コードを自動判定(apt install unar。今回は未実行)
作る側で UTF-8 にする 7-Zip で 7z a -tzip -mcu=on out.zip ファイル -mcu=on は 7-Zip のドキュメントで確認(作成のみ実行。Windows 側での表示は未確認)

Python での確認です。metadata_encoding='cp932' を指定すると、ファイル名が正しく読めました。

python3 -c "
import zipfile
with zipfile.ZipFile('win.zip', metadata_encoding='cp932') as z:
    print(z.namelist())
    z.extractall('m3')
"
['見積書.txt', '資料/議事録_10月.txt']

(extractall 後の m3 にも「見積書.txt」と「資料」ができていることを確認しました。)

ロケールが UTF-8 でないときの見え方

日本語のファイル名を正しく表示するには、端末のロケールが UTF-8 である必要もあります。ロケール未設定(LANG が空)の状態で、Linux 上で作った UTF-8 の ZIP を一覧すると、次のようになりました。

        0  2026-10-02 09:35   #U65e5#U672c#U8a9e/
        2  2026-10-02 09:35   #U65e5#U672c#U8a9e/#U5831#U544a#U66f8.txt

#U65e5 のような表記は、表示できない文字を unzip がコードで示したものです。export LANG=C.UTF-8(または ja_JP.UTF-8)を設定すると、同じ ZIP が 日本語/報告書.txt と表示されました。#Uxxxx が出たら、ZIP ではなくロケールの設定を見直します。

見え方 考えられる理由 対処
МйР╧ПС.txt のような別の文字 CP932 のファイル名を別の文字コードで解釈 unzip -O cp932
#U65e5#U672c のような表記 端末のロケールが UTF-8 でない export LANG=C.UTF-8
?????.txt ロケールが未設定で、-O の変換先に文字がない ロケールを設定してから -O cp932
Windows 側で化ける Linux で作った UTF-8 の ZIP を、対応が十分でないソフトで開いた 7-Zip などで開く。または英数字のファイル名にする

zip と tar の違い

Linux では tar(.tar.gz)もよく使われます。どちらを選ぶかの目安です。

比較項目 zip tar.gz
仕組み ファイルごとに圧縮してまとめる まとめてから全体を圧縮
Windows・macOS での扱い 標準機能で開ける 対応ソフトやコマンドが必要な場合あり
1ファイルだけ取り出す 速い(そのファイルだけ読む) 先頭から順に読む
圧縮率 ファイル単位なので控えめ 似たファイルが多いと高くなりやすい
所有者・権限・シンボリックリンク 一部のみ(リンクは -y が必要) そのまま保てる
パスワード 付けられる(ZipCrypto) 自身にはない(gpg などと組み合わせる)
向いている場面 OS をまたぐ受け渡し Linux 同士のバックアップ・配布

相手が Windows なら zip、Linux 同士で権限も含めて保ちたいなら tar が基本の選び方です。zip でシンボリックリンクをリンクのまま入れるには zip -ry と -y を付けます(付けないとリンク先の実体が入ります。zipinfo で、-y ありは lrwxrwxrwx、なしは通常ファイルとして入ることを確認)。tar の形式別の書き方や速度の比較は、既存記事「tarコマンドの使い方|圧縮・解凍の形式別早見表と速度の実測比較」にまとめています。

よく出るメッセージと対処

実際に出力を確認したメッセージを中心にまとめます。

メッセージ 意味 対処
unzip: cannot find or open none.zip, none.zip.zip or none.zip.ZIP.(終了ステータス9) ファイルが見つからない パスとファイル名を確認
End-of-central-directory signature not found.(終了ステータス9) ZIP 形式ではない、または転送が途中で切れた file ファイル名 で形式を確認。再転送する
skipping: memo.txt incorrect password(終了ステータス82) パスワードが違う 入力し直す
skipping: memo.txt need PK compat. v5.1 (can do v4.6)(終了ステータス81) AES で暗号化された ZIP 7z x で展開
replace xxx? [y]es, [n]o, [A]ll, [N]one, [r]ename: 同名ファイルがある -o か -n を付ける
zip の終了ステータス12 更新・追加するものがなかった -u で変更がないときの正常な結果
zip warning: name not matched: xxx 指定したファイルが無い パスを確認
ZIP の中身が空のディレクトリだけ -r を付けていない zip -r で作り直す

スクリプトで結果を判定するときは、終了ステータスを使います。

if unzip -tq backup.zip > /dev/null 2>&1; then
  echo "ZIP は正常です"
else
  echo "ZIP を確認してください(終了ステータス: $?)"
fi

よくある質問

Q. zip でディレクトリを圧縮したのに、中身が入っていません。なぜですか? A. -r オプションが必要です。zip docs.zip docs では空のディレクトリだけが入り、エラーも出ません。zip -r docs.zip docs と書くと中身まで含まれます。作ったあとに unzip -l で確認するのがおすすめです。

Q. zip の -e と -P はどう違いますか? A. どちらもパスワードを付けますが、-e は対話で入力し、-P はコマンドラインに書きます。-P で書いたパスワードは ps の出力とシェルの履歴に残ることを、この記事の検証で確認しました。手作業では -e を使うと安心です。

Q. unzip で日本語のファイル名が文字化けします。どうすれば直りますか? A. Windows で作った ZIP なら unzip -O cp932 ファイル.zip を試します。-O に対応しているかは unzip -h | grep -- -O で分かります。#U65e5 のような表記が出る場合は、ロケールを export LANG=C.UTF-8 などに設定します。

Q. パスワード付き ZIP をより強い暗号で作るにはどうしますか? A. 7-Zip を使い、7z a -tzip -mem=AES256 -p out.zip ファイル で AES-256 の ZIP を作れます。ファイル名も隠したい場合は .7z 形式で -mhe=on を付けます。Info-ZIP の unzip では開けないので、展開する側も 7-Zip などの対応ソフトを使います。

まとめ

  • ディレクトリの圧縮は zip -r、展開先の指定は unzip -d。作ったら unzip -l で中身を確認
  • 除外は -x 'パターン'、追加は同じコマンド、削除は -d、分割は -s サイズ
  • 上書きは -o、既存を残すなら -n。スクリプトではどちらかを必ず付ける
  • パスワードは -e(対話入力)が基本。-P は ps と履歴にパスワードが残る
  • zip の暗号は ZipCrypto で、ファイル名は隠れない。守りたい情報は 7z の AES-256 を使う
  • Windows 作成 ZIP の文字化けは unzip -O cp932、#Uxxxx 表記はロケールを UTF-8 にする
  • 相手が Windows なら zip、Linux 同士で権限も保つなら tar と使い分ける

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「zip・unzipコマンドの使い方|圧縮・解凍・パスワード・文字化け」

株式会社RJCでは、zip や unzip をはじめとする Linux コマンドの使い方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?