zipコマンド: フォルダーの圧縮とunzipでの展開、圧縮オプション

テスト環境RHEL系AlmaLinux 9.8rootアカウント2026-11-05 確認
圧縮・アーカイブコマンドzipunzip場所/usr/bin/zip
フォルダーの圧縮とunzipでの展開

zipコマンドは、Linuxでファイルやフォルダーを1つのzipファイルにまとめて圧縮するコマンドで、展開するときはunzipを一緒に使います。AlmaLinux 9サーバーでWebサイトのフォルダーをzip -rで圧縮すると35,825バイトが4,158バイトに減り、Windowsで作ったzipファイルの文字化けしたファイル名はunzip -Oで直りました。

以下の出力は、AlmaLinux 9.8サーバーのrootアカウントで作業フォルダー内で実行した結果で、時刻はUTCです。圧縮したsiteフォルダーとメモファイルは試験用に作った例のファイルです。Windowsで作ったzipは、ファイル名をCP949で格納した試験用ファイルで再現しました。

1️⃣ zipコマンドの使い方

  • ↪️ ファイルの圧縮とフォルダーの圧縮(-r)

zipの後ろには、新しく作るzipファイルの名前を先に書き、その後ろに入れるファイルを並べます。以下はreadme.txtとmemo.txtの2つのファイルをnotes.zip 1つに圧縮するコマンドです。

zip notes.zip readme.txt memo.txt
  adding: readme.txt (deflated 92%)
  adding: memo.txt (stored 0%)

行末の[deflated 92%]は、元のサイズから減った割合です。71バイトのmemo.txtの行にある[stored 0%]は、圧縮せずに元のサイズのまま格納したという意味です。

フォルダーを圧縮するときは-rを付けます。-rなしでフォルダー名だけを書くと、フォルダーの項目site/だけが入り、中のファイルは入りません。

zip nodir.zip site
  adding: site/ (stored 0%)

圧縮するsiteフォルダーは、下のようにサブフォルダー3つとファイル6つでできています。

site/
css/
style.css
js/
app.js
logs/
access.log
index.html
about.html
.htaccess

-rを付けると、サブフォルダーとその中のファイル、ドットで始まる.htaccessまで10項目がすべて入ります。

zip -r site.zip site
  adding: site/ (stored 0%)
  adding: site/css/ (stored 0%)
  adding: site/css/style.css (deflated 93%)
  adding: site/js/ (stored 0%)
  adding: site/js/app.js (deflated 87%)
  adding: site/logs/ (stored 0%)
  adding: site/logs/access.log (deflated 94%)
  adding: site/index.html (deflated 91%)
  adding: site/about.html (deflated 87%)
  adding: site/.htaccess (deflated 9%)

できあがったzipファイルに何が入っているかは、展開せずにunzip -lで確認します。入ったファイルのサイズの合計は35,825バイトで、ls -lで見たsite.zipは4,158バイトでした。

unzip -l site.zip
Archive:  site.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  10-28-2026 22:10   site/
        0  10-28-2026 22:10   site/css/
     4431  10-28-2026 22:10   site/css/style.css
        0  10-28-2026 22:10   site/js/
     1882  10-28-2026 22:10   site/js/app.js
        0  10-28-2026 22:10   site/logs/
    24134  10-28-2026 22:10   site/logs/access.log
     3723  10-28-2026 22:10   site/index.html
     1612  10-28-2026 22:10   site/about.html
       43  10-28-2026 22:10   site/.htaccess
---------                     -------
    35825                     10 files
ls -l site.zip
-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip

2️⃣ zipコマンドのオプション

  • ↪️ -x、-u、-d、圧縮レベル、-e

zipコマンドのオプションのうち、-xは入れないファイルをパターンで除外します。ログフォルダーを除くために[site/logs/*]を指定すると、logsフォルダーとaccess.logが外れて8項目だけが入ります。

zip -r site-nolog.zip site -x 'site/logs/*'
  adding: site/ (stored 0%)
  adding: site/css/ (stored 0%)
  adding: site/css/style.css (deflated 93%)
  adding: site/js/ (stored 0%)
  adding: site/js/app.js (deflated 87%)
  adding: site/index.html (deflated 91%)
  adding: site/about.html (deflated 87%)
  adding: site/.htaccess (deflated 9%)

シェルが[*]を先にファイル名へ置き換えないように、パターンはシングルクォートで囲みます。公式マニュアルは同じ目的で[*]の前にバックスラッシュを付けた例を挙げています。

-uは、zipファイルを作った後に変わったファイルだけを入れ直します。index.htmlの末尾に1行足してから-ruで実行すると、そのファイル1つだけが[updating]として入れ直されます。

zip -ru site.zip site
updating: site/index.html (deflated 90%)

変わったファイルがない状態で同じコマンドをもう一度実行すると何も出力されず、終了コードは12でした。公式マニュアルでは、12はzipにすることがないという意味です。

zip -ru site.zip site; echo $?
12

zipファイル内の項目を削除するときは-dを使います。[site/logs/*]を指定すると、site.zipからlogsフォルダーの項目とaccess.logが削除されます。

zip -d site.zip 'site/logs/*'
deleting: site/logs/
deleting: site/logs/access.log

-0から-9までの数字は圧縮レベルで、公式マニュアルによるとデフォルトは-6です。同じsiteフォルダーを-qで出力なしに3回圧縮してサイズを比べました。-uのときにindex.htmlへ1行足した後なので、このときの元のファイルの合計は35,875バイトです。

zip -qr -0 level0.zip site
zip -qr level6.zip site
zip -qr -9 level9.zip site
ls -l level*.zip
-rw-r--r-- 1 root root 37433 Oct 28 23:05 level0.zip
-rw-r--r-- 1 root root  4179 Oct 28 23:05 level6.zip
-rw-r--r-- 1 root root  3874 Oct 28 23:05 level9.zip
圧縮レベルzipファイルのサイズ元のファイル合計との比
元のファイル合計35,875バイト100%
-0 (圧縮しない)37,433バイト104.3%
-6 (デフォルト)4,179バイト11.6%
-9 (最大圧縮)3,874バイト10.8%

-0で作った37,433バイトは、元のファイル合計の35,875バイトより大きくなりました。圧縮しないデータに、項目ごとに付くファイル名・時刻などのヘッダー情報1,558バイトが加わったサイズです。-9はデフォルトより305バイト小さく、その差はすべて一番大きいファイルであるaccess.logから出ました。

パスワードをかけるときは-eを付けます。パスワードは2回入力し、入力した文字は画面に表示されません。

zip -e secret.zip memo.txt
Enter password:
Verify password:
  adding: memo.txt (stored 0%)

-eで作ったsecret.zipも、unzip -lで見るとファイル名とサイズ、日付がパスワードなしで表示されました。暗号化されるのはファイルの中身だけなので、ファイル名まで隠す必要がある資料には向きません。

unzip -l secret.zip
Archive:  secret.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       71  10-28-2026 22:10   memo.txt
---------                     -------
       71                     1 file

パスワードをコマンドラインに直接入れる-Pは、公式マニュアルが安全ではないと警告しているオプションです。同じサーバーのほかのユーザーが実行中のコマンドを見られるためです。マニュアルは、zipの標準の暗号化自体も比較的弱いと説明しています。

-eで作ったzipを展開するときは、unzipがファイルごとにパスワードを尋ね、正しく入力するとそのファイルが展開されます。

unzip secret.zip -d dec
Archive:  secret.zip
[secret.zip] memo.txt password:
 extracting: dec/memo.txt

📌 主なオプション: この記事で実行した結果

オプション作業この記事で確認した結果
zip -rフォルダー内のサブフォルダーとファイルまですべて入れる-rなしではadding: site/の1行、-rを付けると.htaccessまで10項目が入る
zip -x入れないファイルをパターンで除外site/logs/*を除くと、logsフォルダーとaccess.logなしで8項目だけが入る
zip -uzipファイルを作った後に変わったファイルだけを入れ直すupdating: site/index.html (deflated 90%)の1行、変わったファイルがないときは出力なしで終了コード12
zip -dzipファイル内の項目を削除deleting: site/logs/とdeleting: site/logs/access.log
zip -q圧縮中に出る行を隠す-qrで圧縮した3つのコマンド(-0、デフォルト、-9)はどれもadding行なしで終わる
zip -0圧縮せずに格納だけするlevel0.zipが37433バイトで元のファイル合計より大きい
zip -9最も小さく圧縮(デフォルトは-6)level9.zipは3874バイト、デフォルトで作ったlevel6.zipは4179バイト
zip -eパスワードを尋ねて中身を暗号化Enter password:とVerify password:を尋ねてadding: memo.txt (stored 0%)
unzip -l展開せずに入っている項目の一覧を出力site.zipに10 files、合計35825バイト
unzip -d展開先のフォルダーを指定、ないフォルダーは新しく作るcreating: restore/site/から始まり、restoreの下にsiteフォルダーの構造が展開される
unzip -o既にあるファイルを尋ねずにすべて上書き確認なしでinflating行が5つ
unzip -n既にあるファイルは尋ねずにスキップArchive: site.zipの行の次に何も出ない
unzip -t展開せずに圧縮データを検査項目ごとにOKとNo errors detected、切れたbroken.zipはEnd-of-central-directory signature not found
unzip -Ozip内のファイル名の文字エンコーディングを指定-O CP949で文字化けした名前が보고서.txt、견적서.txt(韓国語で「報告書」「見積書」)と表示される
unzip -p展開した内容をファイルにせず標準出力へ送るファイルを作らずに.htaccessの2行だけが出る

📎 その他のオプション: 公式マニュアルより

オプション作業
zip -m圧縮した後に元のファイルとフォルダーを削除(zipファイルをすべて作り終えてから削除し、公式マニュアルは-Tとの併用を推奨)
zip -jフォルダーのパスなしでファイル名だけを入れる
zip -yシンボリックリンクが指すファイルの代わりにリンクをそのまま入れる
zip -T作ったzipファイルを検査し、検査に失敗したら元のzipファイルを変えない
zip -fzipファイルに既にある項目だけを変わったファイルに置き換え、新しいファイルは足さない
zip -i指定したパターンに合うファイルだけを入れる
zip -Pパスワードをコマンドラインに直接書く(公式マニュアルは安全ではないと警告)
unzip -jzip内のフォルダー構造を作らず、ファイルだけを1つのフォルダーに展開
unzip -x展開しない項目を指定
unzip -q展開中に出る行を隠す
unzip -uディスクにないファイルとより新しいファイルだけを展開
unzip -v一覧に圧縮方式、圧縮後のサイズ、比率、CRCまで出力

3️⃣ unzipコマンドの使い方

  • ↪️ Linuxでのzipの展開と-d、-o、-n

Linuxでzipファイルを展開するときは、unzipの後ろにzipファイルの名前を書きます。-dで展開先のフォルダーを決めないと今いるフォルダーに展開されるため(公式マニュアルによる)、今回はrestoreフォルダーを指定しました。

unzip site.zip -d restore
Archive:  site.zip
   creating: restore/site/
   creating: restore/site/css/
  inflating: restore/site/css/style.css
   creating: restore/site/js/
  inflating: restore/site/js/app.js
  inflating: restore/site/index.html
  inflating: restore/site/about.html
  inflating: restore/site/.htaccess

-dで指定したフォルダーがなければunzipが新しく作り、その下にsiteフォルダーの構造がそのまま展開されます。

同じ場所にもう一度展開すると、unzipは既にあるファイルに出会うたびに止まり、上書きするかを尋ねます。[N]oneを選ぶと、残りのファイルも1つも上書きせずに終わります。

unzip site.zip -d restore
Archive:  site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: N

尋ねずに処理するときは-oか-nを付けます。-oはあるファイルをすべて上書きし、-nはあるファイルをスキップします。公式マニュアルが-oを危険なオプションとしているため、-oは上書きしてもよいフォルダーかを先に確かめてから付けます。

unzip -o site.zip -d restore
Archive:  site.zip
  inflating: restore/site/css/style.css
  inflating: restore/site/js/app.js
  inflating: restore/site/index.html
  inflating: restore/site/about.html
  inflating: restore/site/.htaccess
unzip -n site.zip -d restore
Archive:  site.zip

ファイルがすべて既にある場所に-nで展開すると、Archiveの行の次に何も出ません。

zipファイル内の一部だけを展開するときは、zipファイル名の後ろにパスやパターンを書きます。[site/css/*]を指定すると、cssフォルダーとstyle.cssだけが展開されます。

unzip site.zip 'site/css/*' -d part
Archive:  site.zip
   creating: part/site/css/
  inflating: part/site/css/style.css

4️⃣ unzipのエラー

  • ↪️ End-of-central-directoryとファイル名の文字化け

ほかのサーバーから受け取ったzipファイルは、展開する前にunzip -tで検査します。圧縮データに問題がなければ項目ごとにOKが出て、最後の行に[No errors detected]が出ます。

unzip -t site.zip
Archive:  site.zip
    testing: site/                    OK
    testing: site/css/                OK
    testing: site/css/style.css       OK
    testing: site/js/                 OK
    testing: site/js/app.js           OK
    testing: site/index.html          OK
    testing: site/about.html          OK
    testing: site/.htaccess           OK
No errors detected in compressed data of site.zip.

転送が途切れて後ろの部分が切れたzipは、[End-of-central-directory signature not found]で終わりました。-dでlogsの項目を削除して2,436バイトになったsite.zipから、先頭の2,000バイトだけを残したbroken.zipを-tで検査した結果です。

unzip -t broken.zip
Archive:  broken.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of broken.zip or
        broken.zip.zip, and cannot find broken.zip.ZIP, period.

unzipはzipファイルの末尾にあるファイル一覧(central directory)を先に読みます。そのため、後ろの部分が切れたbroken.zipは最初の項目も検査できませんでした。

zipではないファイルを渡しても同じメッセージが出ました。tarでまとめたsite.tar.gzをunzipで開くと同じエラーで終わり、tar.gzファイルは tarコマンドで展開します。

unzip site.tar.gz
Archive:  site.tar.gz
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of site.tar.gz or
        site.tar.gz.zip, and cannot find site.tar.gz.ZIP, period.

Windowsで作ったzipファイルは、ファイル名がUTF-8ではなくWindowsの文字エンコーディングで入っていることがあります。名前をCP949で格納したreport-win.zipをUTF-8のサーバーでunzip -lで開くと、ファイル名が読めない記号に化けて表示されました。

unzip -l report-win.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   ║╕░э╝н.txt
       17  10-28-2026 22:10   ░▀└√╝н.txt
---------                     -------
       43                     2 files

-Oの後ろにそのzipを作ったWindowsの文字エンコーディングを書くと名前が正しく表示され、同じオプションで展開したファイルも元の名前で作られます。

unzip -O CP949 -l report-win.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   보고서.txt
       17  10-28-2026 22:10   견적서.txt
---------                     -------
       43                     2 files
unzip -O CP949 report-win.zip -d win
Archive:  report-win.zip
  inflating: win/보고서.txt
  inflating: win/견적서.txt

unzipのヘルプによると、-OはDOS・Windowsで作ったzipに、-Iはそれ以外のシステムで作ったzipに指定するオプションです。

展開中に出たエラーメッセージと、次に確認することは以下のとおりです。

出力意味次に確認すること
End-of-central-directory signature not foundzipファイル末尾のファイル一覧が見つからない — 末尾が切れたファイルかzipではないファイル元のファイルとサイズを比べて受け取り直す・tar.gzはtarで
cannot find or openその名前のファイルが今のフォルダーにないlsでファイル名と場所
skipping: … incorrect passwordパスワードを3回間違えてそのファイルをスキップ(終了コード82)パスワードの大文字・小文字と入力言語
ファイル名が記号に化ける名前がWindowsの文字エンコーディングで保存されている-Oの後ろにそのエンコーディング(CP949など)

🔲 zipコマンドシミュレーター

下のシミュレーターで、zipで圧縮し、unzipで一覧を見たり展開したりする手順を自分で入力して試せます。

zipコマンドシミュレーターZip 3.0 · UnZip 6.00
[root@server work]#
ブラウザー内だけで動き、実際のファイルは圧縮しません。圧縮率は実測値で、シミュレーターで新しく作ったファイルは推定値です。↑↓で前に入力したコマンドを呼び出せます。

🔢 FAQ & おすすめコンテンツ

gzipで圧縮した.gzファイルをunzipで開くと[End-of-central-directory signature not found]で終わりました。[gzip -d readme.txt.gz]で展開すると、readme.txt.gzがreadme.txtに戻りました。複数のファイルをtarでまとめてからgzipで圧縮した.tar.gzは、tarで一度に展開します。

確認したAlmaLinux 9サーバーでは、zipとunzipはそれぞれzip、unzipパッケージがインストールしたコマンドでした。そのため、RHEL系は[sudo dnf install zip unzip]、Debian系は[sudo apt install zip unzip]でインストールします(Debian公式パッケージ一覧による)。

unzip -pの後ろにzipファイルとその中のパスを書くと、中身がそのまま画面に出ます。[unzip -p site.zip site/.htaccess]で実行すると、ファイルを作らずに.htaccessの2行だけが出ました。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 10   +   3   =