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 | 内容を詳細に一覧表示(圧縮率も表示) |
-t | ZIPファイルの整合性テスト |
-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 との使い分け
unzip | tar | |
|---|---|---|
| 対応形式 | .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. unzip と python3 -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
参考リンク
公式ドキュメント
関連記事(本サイト)
- Linux grep オプション一覧 – grepコマンドリファレンス
- Linux sed オプション一覧 – sedコマンドリファレンス
- Linuxでファイルを再帰的に削除する方法 – ファイル操作
- Linux「command not found」エラーの解決方法 – よくあるLinuxエラー
本記事は2026年6月時点の情報をもとに、Ubuntu 24.04 LTS・unzip 6.0 での動作確認に基づき作成しています。環境によってオプションの挙動が異なる場合があるため、最新情報は各公式ドキュメントをご確認ください。
-
前の記事
rails db:migrate の使い方|マイグレーション作成・実行・ロールバックを徹底解説 2026.06.26
-
次の記事
Rails save vs save! の違い|戻り値・例外・関連メソッド・使い分けを徹底解説 2026.06.27
コメントを書く