Linux unzipコマンドで展開先ディレクトリを指定する方法|オプション一覧と実用例を徹底解説

Linux unzipコマンドで展開先ディレクトリを指定する方法|オプション一覧と実用例を徹底解説

# 最も聞かれる質問への回答をまず示します
unzip ファイル.zip -d 展開先ディレクトリ/

「unzip でディレクトリを指定したい」という検索でたどり着いた方は、上の1行で解決するはずです。

ただし実際の運用では、展開先が存在しない場合・上書きの挙動・文字化け・パスワード付きZIP など、もう少し知っておくべきことがあります。本記事ではそれらを含めて完全に解説します。


目次

結論:先に答えを出す

# 展開先ディレクトリを指定して解凍
unzip archive.zip -d /展開先/ディレクトリ/

# 展開先が存在しなくても自動作成される
unzip archive.zip -d /tmp/myapp/

# カレントディレクトリに展開(デフォルト)
unzip archive.zip

# 内容を確認してから展開(展開しない)
unzip -l archive.zip

# 上書き確認なしで強制展開
unzip -o archive.zip -d /展開先/

# 既存ファイルをスキップして展開
unzip -n archive.zip -d /展開先/

インストール確認

# バージョン確認
unzip --version

# インストールされていない場合
sudo apt install unzip   # Ubuntu/Debian
sudo dnf install unzip   # RHEL/CentOS/Fedora
sudo apk add unzip       # Alpine Linux
brew install unzip       # macOS(Homebrew)

基本構文

unzip [オプション] ZIPファイル [展開するファイルのパターン] [-d 展開先ディレクトリ]

オプション一覧

よく使うオプション

オプション説明
-d ディレクトリ展開先ディレクトリを指定
-l展開せずに内容を一覧表示
-v内容を詳細に一覧表示(圧縮率も表示)
-tZIPファイルの整合性テスト
-o既存ファイルを確認なしで上書き
-n既存ファイルをスキップ(上書きしない)
-q出力を抑制(静かに実行)
-qq出力をさらに抑制(エラーのみ)
-P パスワードパスワードを指定
-jディレクトリ構造を無視してフラットに展開
-x パターン指定パターンのファイルを除外
-O 文字コードファイル名の文字コードを指定(文字化け対策)

出力制御

オプション説明
-p標準出力に展開(ファイルに書かない)
-c標準出力に展開しつつファイル名も表示
-e通常の展開(デフォルト)

ディレクトリ指定の詳細(-d オプション)

基本の使い方

# 絶対パスで指定
unzip archive.zip -d /var/www/html/

# 相対パスで指定
unzip archive.zip -d ./output/

# ホームディレクトリ配下に展開
unzip archive.zip -d ~/projects/myapp/

# 存在しないディレクトリは自動作成される
unzip archive.zip -d /tmp/new_dir/subdir/
# creates: /tmp/new_dir/subdir/

-d オプションの位置

-d はZIPファイル名の前後どちらに書いても動作します。

# どちらも同じ結果
unzip -d /tmp/output/ archive.zip
unzip archive.zip -d /tmp/output/

# ただし慣習的にはZIPファイルの後ろに書くことが多い
unzip archive.zip -d /tmp/output/

ディレクトリ名にスペースが含まれる場合

# クォートで囲む
unzip archive.zip -d "/var/www/my app/"
unzip archive.zip -d '/var/www/my app/'

# または変数に入れて使う
DEST="/var/www/my app/"
unzip archive.zip -d "$DEST"

展開内容の確認(-l / -v)

-l:内容を一覧表示

展開前に中身を確認する習慣をつけましょう。

unzip -l archive.zip
Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1234  2026-06-01 12:00   README.md
     5678  2026-06-01 12:01   src/main.go
    12345  2026-06-01 12:01   src/utils.go
---------                     -------
    19257                     3 files

-v:圧縮率も含めた詳細表示

unzip -v archive.zip
Archive:  archive.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
    1234  Defl:N      456  63% 2026-06-01 12:00 abcd1234  README.md
    5678  Defl:N     2345  59% 2026-06-01 12:01 efgh5678  src/main.go
--------          -------  ---                            -------
    6912             2801  59%                            2 files

-t:整合性テスト

# 展開せずにZIPファイルが壊れていないかテスト
unzip -t archive.zip
# testing: README.md                 OK
# No errors detected in compressed data in archive.zip.

上書きの制御(-o / -n)

デフォルトの挙動(確認あり)

unzip archive.zip -d /tmp/output/
# replace /tmp/output/README.md? [y]es, [n]o, [A]ll, [N]one, [r]ename:

対話的に確認が入ります。スクリプトでは -o-n を指定しましょう。

-o:強制上書き

# 既存ファイルを確認なしで上書き
unzip -o archive.zip -d /tmp/output/

-n:スキップ(上書きしない)

# 既存ファイルはスキップ、新しいファイルだけ展開
unzip -n archive.zip -d /tmp/output/

スクリプトでの使い方

#!/bin/bash
# 確認プロンプトが出ないようにする
unzip -o archive.zip -d /tmp/output/ -q

# または yes コマンドで自動的に y を送る
yes | unzip archive.zip -d /tmp/output/

特定ファイルだけ展開

# 特定のファイルだけ展開
unzip archive.zip README.md -d /tmp/

# パターンでマッチ(クォートで囲む)
unzip archive.zip "src/*.go" -d /tmp/

# 複数のファイルを指定
unzip archive.zip README.md src/main.go -d /tmp/

# 特定のファイルを除外して展開(-x)
unzip archive.zip -x "*.log" -d /tmp/output/
unzip archive.zip -x "__pycache__/*" -x "*.pyc" -d /tmp/output/

ディレクトリ構造を無視して展開(-j)

# ZIP内のディレクトリ構造を無視してフラットに展開
unzip -j archive.zip -d /tmp/flat/

# archive.zip の中身が
# src/main.go
# src/utils.go
# README.md
# の場合、-j を使うと /tmp/flat/ に
# main.go, utils.go, README.md が並ぶ

パスワード付きZIPの展開

# -P でパスワードを指定
unzip -P パスワード archive.zip -d /tmp/output/

# パスワードを対話的に入力(コマンド履歴に残らないのでセキュア)
unzip archive.zip -d /tmp/output/
# Enter password:

# スクリプトで使う場合(パスワードを環境変数から読む)
ZIP_PASS="mypassword"
unzip -P "$ZIP_PASS" archive.zip -d /tmp/output/

⚠️ -P でコマンドラインに直接パスワードを書くとシェルの履歴に残ります。機密性が高いパスワードは対話入力を使いましょう。


文字化け対策(-O オプション)

Windows で作成された ZIP ファイルを Linux で展開すると、日本語ファイル名が文字化けすることがあります。

# -O で文字コードを指定(GNU unzip の拡張オプション)
unzip -O CP932 archive.zip -d /tmp/output/   # Windows(Shift-JIS)
unzip -O UTF-8 archive.zip -d /tmp/output/   # UTF-8

# -O が使えない場合(macOS や古い unzip)
# → unar コマンドを使う
sudo apt install unar
unar archive.zip -o /tmp/output/

# または python3 で展開
python3 -c "
import zipfile, os, sys

zip_path = sys.argv[1]
dest = sys.argv[2]

with zipfile.ZipFile(zip_path) as zf:
    for info in zf.infolist():
        try:
            info.filename = info.filename.encode('cp437').decode('cp932')
        except (UnicodeDecodeError, UnicodeEncodeError):
            pass
        zf.extract(info, dest)
        print(info.filename)
" archive.zip /tmp/output/

macOS での文字化け対策

# macOS 標準の unzip は -O に対応していない
# Homebrew の unzip をインストール
brew install unzip
/opt/homebrew/bin/unzip -O CP932 archive.zip -d /tmp/output/

# または unar を使う
brew install unar
unar archive.zip -o /tmp/output/

実用パターン集

同名ディレクトリに安全に展開

# ZIP を専用ディレクトリに展開(ZIP名と同名のフォルダを作る)
ZIP="archive.zip"
DEST="${ZIP%.zip}"   # 拡張子を除いたファイル名
unzip "$ZIP" -d "$DEST"

# 例:archive.zip → archive/ に展開

複数のZIPを一括展開

# カレントの全ZIPを個別ディレクトリに展開
for zip in *.zip; do
  dir="${zip%.zip}"
  echo "展開中: $zip → $dir/"
  unzip -q "$zip" -d "$dir"
done

# /tmp/ 以下にまとめて展開
for zip in *.zip; do
  unzip -q "$zip" -d /tmp/extracted/
done

展開後に特定ファイルだけ使う

# 一時ディレクトリに展開して目的のファイルをコピー
TMPDIR=$(mktemp -d)
unzip -q archive.zip -d "$TMPDIR"

# 目的のファイルをコピー
cp "$TMPDIR/config/settings.yaml" ./

# 後片付け
rm -rf "$TMPDIR"

CI/CD での典型パターン

#!/bin/bash
set -euo pipefail

ARTIFACT="build-$(date +%Y%m%d).zip"
DEPLOY_DIR="/var/www/html"
BACKUP_DIR="/var/backups/html-$(date +%Y%m%d%H%M%S)"

# 既存のファイルをバックアップ
cp -r "$DEPLOY_DIR" "$BACKUP_DIR"

# 展開(上書き・出力抑制)
unzip -o -q "$ARTIFACT" -d "$DEPLOY_DIR"

echo "デプロイ完了: $DEPLOY_DIR"
echo "バックアップ: $BACKUP_DIR"

内容を確認してから展開

#!/bin/bash
ZIP="$1"
DEST="$2"

# 引数チェック
if [ -z "$ZIP" ] || [ -z "$DEST" ]; then
  echo "使い方: $0 <ZIPファイル> <展開先>"
  exit 1
fi

# 内容を確認
echo "=== 展開内容 ==="
unzip -l "$ZIP"
echo ""

# 確認プロンプト
read -rp "$DEST に展開しますか? [y/N]: " answer
if [[ "$answer" =~ ^[Yy]$ ]]; then
  unzip -o "$ZIP" -d "$DEST"
  echo "展開完了: $DEST"
else
  echo "キャンセルしました"
fi

zip コマンドとの組み合わせ

# ZIP を作成
zip -r archive.zip ./src/

# ZIP を作成(特定ファイルを除外)
zip -r archive.zip ./src/ -x "*.log" -x "node_modules/*"

# ZIP を作成してすぐ展開(内容確認後)
zip -r /tmp/build.zip ./dist/ && unzip -l /tmp/build.zip

tar との使い分け

unziptar
対応形式.zip.tar .tar.gz .tar.bz2 .tar.xz など
展開先指定-d ディレクトリ-C ディレクトリ
Windows との互換性高い低い
Unix 権限の保持一部完全
主な用途Windows との受け渡し・Web からのダウンロードLinux/macOS でのアーカイブ
# tar.gz の展開先指定(参考)
tar -xzf archive.tar.gz -C /展開先/ディレクトリ/

# tar.gz と unzip の対応
unzip archive.zip  -d /tmp/  ↔  tar -xzf archive.tar.gz -C /tmp/
unzip -l archive.zip         ↔  tar -tzf archive.tar.gz
unzip -t archive.zip         ↔  tar -tzf archive.tar.gz > /dev/null

トラブルシューティング

「End-of-central-directory signature not found」

# ZIPファイルが壊れているか、ZIPではないファイル
file archive.zip
# → archive.zip: Zip archive data  (正常)
# → archive.zip: HTML document     (ZIPではない)

# 整合性チェック
unzip -t archive.zip

# 再ダウンロードを試みる
wget -c https://example.com/archive.zip  # -c で続きからダウンロード

「cannot find or open」

# ファイルの存在確認
ls -la archive.zip

# パスが正しいか確認
find . -name "*.zip"

# 権限の確認
ls -la archive.zip
# -rw-r--r-- ← 読み込み権限があるか

展開先の権限エラー

# 「cannot create」エラー
# 展開先ディレクトリの権限を確認
ls -la /展開先/

# 権限を付与
sudo chmod 755 /展開先/
# または
sudo chown $USER /展開先/

# sudo で展開
sudo unzip archive.zip -d /var/www/html/

ディスク容量不足

# 展開後のサイズを確認してから展開
unzip -v archive.zip | tail -1  # 合計サイズを確認

# 展開先のディスク容量を確認
df -h /展開先/

# 容量確保後に展開

「zip bomb」対策

# 展開前に圧縮率を確認(異常に高い場合は要注意)
unzip -v archive.zip

# 安全な場所に展開してサイズを確認
unzip archive.zip -d /tmp/test_extract/
du -sh /tmp/test_extract/

よくある質問(FAQ)

Q1. -d で指定したディレクトリが存在しない場合は?

自動的に作成されます。複数階層のディレクトリも一度に作成されます。

unzip archive.zip -d /tmp/a/b/c/
# /tmp/a/b/c/ が存在しなくても自動作成される

Q2. ZIP内のトップレベルディレクトリをスキップして展開したい

ZIP の中身が myapp-v1.0/ というディレクトリ1つで、その中身だけを展開したい場合:

# 方法1:一時ディレクトリに展開してから移動
TMPDIR=$(mktemp -d)
unzip archive.zip -d "$TMPDIR"
mv "$TMPDIR"/*/. /展開先/
rm -rf "$TMPDIR"

# 方法2:-j でフラット展開(ディレクトリ構造が複雑な場合は注意)
unzip -j archive.zip -d /展開先/

# 方法3:python3 で展開(最も確実)
python3 -c "
import zipfile, os, sys

with zipfile.ZipFile(sys.argv[1]) as zf:
    # トップレベルのディレクトリ名を取得
    top = os.path.commonpath(zf.namelist())
    for member in zf.infolist():
        member.filename = os.path.relpath(member.filename, top)
        if member.filename:
            zf.extract(member, sys.argv[2])
" archive.zip /展開先/

Q3. 展開後のファイルの権限はどうなりますか?

ZIP ファイルには Unix のファイルパーミッション情報が含まれている場合と含まれていない場合があります。Windows で作成した ZIP は権限情報を持たないことが多く、展開後は 644(ファイル)・755(ディレクトリ)になることが多いです。権限を正確に保持したい場合は tar を使うのが確実です。

Q4. 大きな ZIP ファイルを展開するときの注意点は?

# 展開前にサイズを確認
unzip -v archive.zip | awk 'END{print $1/1024/1024 " MB"}'

# ディスク容量を確認
df -h /展開先/

# 時間がかかる場合は nohup でバックグラウンド実行
nohup unzip -o archive.zip -d /展開先/ > /tmp/unzip.log 2>&1 &
tail -f /tmp/unzip.log  # 進捗を確認

Q5. unzippython3 -m zipfile の違いは?

# Python 標準ライブラリの zipfile モジュールでも展開できる
python3 -m zipfile -e archive.zip /展開先/

# 内容確認
python3 -m zipfile -l archive.zip

# unzip がインストールされていない環境で使える
# ただし -O(文字コード指定)などの高度なオプションはない

まとめ

unzip でディレクトリを指定するには -d オプション を使います。

# 基本形(これだけ覚えれば OK)
unzip ファイル.zip -d 展開先ディレクトリ/

よく使うオプションの組み合わせ:

# 展開前に確認
unzip -l archive.zip

# 指定ディレクトリに展開(上書き確認なし・出力抑制)
unzip -oq archive.zip -d /展開先/

# 既存ファイルをスキップして展開
unzip -nq archive.zip -d /展開先/

# 文字化け対策(Windows製ZIP)
unzip -O CP932 archive.zip -d /展開先/

# パスワード付き
unzip -P パスワード archive.zip -d /展開先/

tar との使い分け:

  • Windows との受け渡し・Web ダウンロードのアーカイブ → unzip
  • Linux 環境内でのアーカイブ・権限保持が必要 → tar

参考リンク

公式ドキュメント

関連記事(本サイト)


本記事は2026年6月時点の情報をもとに、Ubuntu 24.04 LTS・unzip 6.0 での動作確認に基づき作成しています。環境によってオプションの挙動が異なる場合があるため、最新情報は各公式ドキュメントをご確認ください。