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コマンドの使い方
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つでできています。
-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.zipArchive: 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 filesls -l site.zip-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip2️⃣ zipコマンドのオプション
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 siteupdating: site/index.html (deflated 90%)変わったファイルがない状態で同じコマンドをもう一度実行すると何も出力されず、終了コードは12でした。公式マニュアルでは、12はzipにすることがないという意味です。
zip -ru site.zip site; echo $?12zipファイル内の項目を削除するときは-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 sitezip -qr level6.zip sitezip -qr -9 level9.zip sitels -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.txtEnter password:
Verify password:
adding: memo.txt (stored 0%)-eで作ったsecret.zipも、unzip -lで見るとファイル名とサイズ、日付がパスワードなしで表示されました。暗号化されるのはファイルの中身だけなので、ファイル名まで隠す必要がある資料には向きません。
unzip -l secret.zipArchive: 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 decArchive: 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 -u | zipファイルを作った後に変わったファイルだけを入れ直す | updating: site/index.html (deflated 90%)の1行、変わったファイルがないときは出力なしで終了コード12 | |
| zip -d | zipファイル内の項目を削除 | 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 -O | zip内のファイル名の文字エンコーディングを指定 | -O CP949で文字化けした名前が보고서.txt、견적서.txt(韓国語で「報告書」「見積書」)と表示される | |
| unzip -p | 展開した内容をファイルにせず標準出力へ送る | ファイルを作らずに.htaccessの2行だけが出る |
📎 その他のオプション: 公式マニュアルより
| オプション | 作業 | |
|---|---|---|
| zip -m | 圧縮した後に元のファイルとフォルダーを削除(zipファイルをすべて作り終えてから削除し、公式マニュアルは-Tとの併用を推奨) | |
| zip -j | フォルダーのパスなしでファイル名だけを入れる | |
| zip -y | シンボリックリンクが指すファイルの代わりにリンクをそのまま入れる | |
| zip -T | 作ったzipファイルを検査し、検査に失敗したら元のzipファイルを変えない | |
| zip -f | zipファイルに既にある項目だけを変わったファイルに置き換え、新しいファイルは足さない | |
| zip -i | 指定したパターンに合うファイルだけを入れる | |
| zip -P | パスワードをコマンドラインに直接書く(公式マニュアルは安全ではないと警告) | |
| unzip -j | zip内のフォルダー構造を作らず、ファイルだけを1つのフォルダーに展開 | |
| unzip -x | 展開しない項目を指定 | |
| unzip -q | 展開中に出る行を隠す | |
| unzip -u | ディスクにないファイルとより新しいファイルだけを展開 | |
| unzip -v | 一覧に圧縮方式、圧縮後のサイズ、比率、CRCまで出力 |
3️⃣ unzipコマンドの使い方
Linuxでzipファイルを展開するときは、unzipの後ろにzipファイルの名前を書きます。-dで展開先のフォルダーを決めないと今いるフォルダーに展開されるため(公式マニュアルによる)、今回はrestoreフォルダーを指定しました。
unzip site.zip -d restoreArchive: 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 restoreArchive: 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 restoreArchive: 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/.htaccessunzip -n site.zip -d restoreArchive: site.zipファイルがすべて既にある場所に-nで展開すると、Archiveの行の次に何も出ません。
zipファイル内の一部だけを展開するときは、zipファイル名の後ろにパスやパターンを書きます。[site/css/*]を指定すると、cssフォルダーとstyle.cssだけが展開されます。
unzip site.zip 'site/css/*' -d partArchive: site.zip
creating: part/site/css/
inflating: part/site/css/style.css4️⃣ unzipのエラー
ほかのサーバーから受け取ったzipファイルは、展開する前にunzip -tで検査します。圧縮データに問題がなければ項目ごとにOKが出て、最後の行に[No errors detected]が出ます。
unzip -t site.zipArchive: 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.zipArchive: 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.gzArchive: 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.zipArchive: 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.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 보고서.txt
17 10-28-2026 22:10 견적서.txt
--------- -------
43 2 filesunzip -O CP949 report-win.zip -d winArchive: report-win.zip
inflating: win/보고서.txt
inflating: win/견적서.txtunzipのヘルプによると、-OはDOS・Windowsで作ったzipに、-Iはそれ以外のシステムで作ったzipに指定するオプションです。
展開中に出たエラーメッセージと、次に確認することは以下のとおりです。
| 出力 | 意味 | 次に確認すること |
|---|---|---|
| End-of-central-directory signature not found | zipファイル末尾のファイル一覧が見つからない — 末尾が切れたファイルかzipではないファイル | 元のファイルとサイズを比べて受け取り直す・tar.gzはtarで |
| cannot find or open | その名前のファイルが今のフォルダーにない | lsでファイル名と場所 |
| skipping: … incorrect password | パスワードを3回間違えてそのファイルをスキップ(終了コード82) | パスワードの大文字・小文字と入力言語 |
| ファイル名が記号に化ける | 名前がWindowsの文字エンコーディングで保存されている | -Oの後ろにそのエンコーディング(CP949など) |
🔲 zipコマンドシミュレーター
下のシミュレーターで、zipで圧縮し、unzipで一覧を見たり展開したりする手順を自分で入力して試せます。
🔢 FAQ & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。