LinuxでZIPファイルを展開したら日本語ファイル名が文字化けした時の対処法|unzip・unar・convmvの使い分け

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxトラブルシューティング > LinuxでZIPファイルを展開したら日本語ファイル名が文字化けした時の対処法|unzip・unar・convmvの使い分け
「Windowsで圧縮して送ってもらったZIPを展開したら、ファイル名がすべて文字化けして読めなくなった」
このトラブルは、Linux(UTF-8環境)とWindows(Shift_JIS環境)のファイル名文字コードの違いから発生する。受け取ったZIPを開くたびに文字化けするのは、運用上なかなか地味なストレスになる。

この記事では、文字化けの原因を理解したうえで、unzip・unar・convmv を使った具体的な対処手順を解説する。RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みだ。

この記事のポイント

・WindowsのZIPはShift_JIS(CP932)でファイル名を保存するため、Linux展開時に文字化けする
・RHEL系では unzip -O CP932 でエンコーディングを指定して展開できる
・Ubuntu系は標準 unzip が -O を非サポート。unar コマンドで自動判定展開が最も手軽
・展開済みで文字化けしてしまった場合は convmv でファイル名を後から変換できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜLinuxでWindowsのZIPを展開すると文字化けするのか

ZIPフォーマットの仕様(PKWARE)では、ファイル名のエンコーディングは本来オプション扱いだった。古いWindowsの圧縮ツールはファイル名をShift_JIS(CP932)で保存していた。一方、Linux の unzip はデフォルトでシステムのロケール(通常UTF-8)を前提として展開する。

CP932のバイト列をUTF-8として解釈するため、ファイル名が読めない文字の羅列になる。具体的にはこのような状態になる。

# CP932(Shift_JIS)で作成されたZIPをデフォルト設定で展開した場合 $ unzip windows_data.zip Archive: windows_data.zip inflating: ???_20240901.csv inflating: ???_??.xlsx

なお、7-ZipやWinRAR最新版はZIPのUTF-8フラグ(General Purpose Bit Flag の bit 11)を立て、ファイル名をUTF-8で保存するため、これらで作ったZIPは文字化けしないことが多い。古いWindowsツールや一部のメールソフト添付機能が作成したZIPで発生するケースが多い。

文字化けを確認する手順

1. unzip -lでZIPの中身を確認する

展開前にまずZIPの中身を確認しよう。unzip -l で一覧表示できる(ファイルの取り出しはしない)。

# ZIPの内容一覧を確認(展開はしない) $ unzip -l windows_data.zip Archive: windows_data.zip Length Date Time Name --------- ---------- ----- ---- 4096 09-01-2024 12:00 ???_20240901.csv 2048 09-01-2024 12:01 ???_??.xlsx --------- ------- 6144 2 files

ファイル名が化けて表示された場合、ZIPのファイル名がCP932でエンコードされている可能性が高い。

2. nkfでエンコーディングを推測する

nkf(文字コード変換ツール)を使うと、ファイル名のバイト列からエンコーディングを推測できる。

# nkfのインストール # RHEL系: sudo dnf install nkf # Ubuntu: sudo apt install nkf # zipinfoとnkfを組み合わせてエンコーディングを判定 $ zipinfo -1 windows_data.zip | nkf --guess Shift_JIS

「Shift_JIS」または「CP932」と出た場合は、以下の3つの方法で対処する。

方法1: unzip -OでCP932指定して展開する(RHEL系推奨)

RHEL系ディストリビューション(RHEL9・Rocky Linux・AlmaLinux)の unzip パッケージは日本語対応パッチが当たっており、-O オプションでファイル名のエンコーディングを指定できる。

1. 基本的な使い方

# -O でCP932(Shift_JIS)を指定して展開 $ unzip -O CP932 windows_data.zip -d /tmp/extracted/ Archive: windows_data.zip inflating: /tmp/extracted/受注一覧_20240901.csv inflating: /tmp/extracted/注文データ_9月.xlsx # 展開後の確認 $ ls /tmp/extracted/ 受注一覧_20240901.csv 注文データ_9月.xlsx

-d で展開先ディレクトリを指定するとカレントディレクトリを汚染せずに済む。

-O CP932:ファイル名のエンコーディングをCP932(Shift_JIS)として解釈する
-d /tmp/extracted/:展開先のディレクトリを指定する(ない場合は自動作成)

2. -Oオプションが使えない場合(Ubuntu系)

Ubuntuの標準 unzip-O オプションをサポートしていない。実行するとエラーになる。

# Ubuntu標準のunzipは -O を認識しない $ unzip -O CP932 windows_data.zip unzip: illegal option -- O

Ubuntu では後述の方法2(unar)を使うこと。

ファイル操作で詰まるのは「Linux基盤の理解」が抜けているサインかもしれません

文字コード・アーカイブ・パーミッションといったトラブルは、Linuxの動作原理を体系的に理解すれば自分で原因を特定して対処できるようになります。断片的なコマンド暗記より、現場で再現性のある判断力を身につける方が長期的に効率が高いです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

方法2: unarコマンドで自動判定展開する(Ubuntu/Rocky両対応)

unar(The Unarchiver)は文字コードを自動判定して展開するコマンドだ。RHEL系・Ubuntu系の両方で利用でき、-O オプションが使えない環境での定番手段となっている。

1. unarのインストール

# Ubuntu 24.04 / Debian $ sudo apt install unar # Rocky Linux 9 / AlmaLinux 9(EPELリポジトリを有効化後) $ sudo dnf install epel-release $ sudo dnf install unar # インストール確認 $ unar --version unar 1.10.7

2. unarで展開する

# unarで展開(エンコーディングは自動判定) $ unar windows_data.zip -o /tmp/extracted_unar/ windows_data.zip: ZIP 受注一覧_20240901.csv (4 KB)... OK. 注文データ_9月.xlsx (2 KB)... OK. Successfully extracted to "/tmp/extracted_unar/". # 結果を確認 $ ls /tmp/extracted_unar/windows_data/ 受注一覧_20240901.csv 注文データ_9月.xlsx

unar はファイル名のエンコーディングを自動で判定してくれる。特にエンコーディングを意識せずに展開できるのが利点だ。-o で展開先ディレクトリを指定できる。

-o /tmp/extracted_unar/:展開先を指定(デフォルトはカレントディレクトリ)

3. エンコーディングを明示指定したい場合

自動判定がうまくいかない場合は -e オプションでエンコーディングを明示できる。

# エンコーディングを明示して展開(-e オプション) $ unar -e CP932 windows_data.zip -o /tmp/extracted_unar/

方法3: 展開済みのファイル名をconvmvで修正する

すでに文字化けした状態でZIPを展開してしまった場合でも、convmv(CONVert file names using iconv)でファイル名を後から修正できる。

1. convmvのインストール

# Ubuntu 24.04 $ sudo apt install convmv # Rocky Linux 9 $ sudo dnf install convmv # インストール確認 $ convmv --version convmv 2.05

2. まず--dry-runで変換内容を確認する

実務上の注意点として、convmv は必ず --dry-run(または --notest の逆、デフォルトがdry-run相当)で変換前後のファイル名を確認してから本番実行すること。誤ったエンコーディング指定で余計に壊す失敗が多い。

# まず --dry-run で変換前後のファイル名を確認(実際には変更しない) $ convmv -f shift_jis -t utf-8 -r --dry-run /tmp/extracted/ Starting a dry run without changes ... mv "./tmp/extracted/????????_20240901.csv" "./tmp/extracted/受注一覧_20240901.csv" mv "./tmp/extracted/??????_??.xlsx" "./tmp/extracted/注文データ_9月.xlsx" Ready! # 変換内容が正しいことを確認したら --notest で本番実行 $ convmv -f shift_jis -t utf-8 -r --notest /tmp/extracted/ mv "./tmp/extracted/????????_20240901.csv" "./tmp/extracted/受注一覧_20240901.csv" mv "./tmp/extracted/??????_??.xlsx" "./tmp/extracted/注文データ_9月.xlsx" Ready!

-f shift_jis:変換元の文字コード(Shift_JIS / CP932)
-t utf-8:変換先の文字コード(UTF-8)
-r:サブディレクトリを再帰的に処理
--notest:実際にファイル名を変更する(指定なしはdry-run)

すでにUTF-8で正しくデコードされているファイルは convmv がスキップしてくれるので、ディレクトリごとまとめて実行しても問題ない。

「Bad CRC」「invalid zip file」エラーが出た時の切り分け

文字化けではなく「Bad CRC」エラーが出る場合は、ZIPファイル自体が破損している可能性がある。文字化けとは別の問題なので、原因を切り分けて対処しよう。

# ZIPの整合性チェック(-t オプション) $ unzip -t windows_data.zip Archive: windows_data.zip testing: ???_20240901.csv Bad CRC d851e3ab (should be 1a2b3c4d) ERROR: Bad CRC 0 for file

Bad CRCが出た場合の対処方法を確認しよう。

送信元で再圧縮してもらう:最も確実な方法。ネットワーク転送やメール添付でファイルが壊れることがある
zipコマンドで修復を試みる:zip -FF corrupted.zip --out fixed.zip で部分的な修復を試みることができる
7zで強制展開:7z e windows_data.zip はBad CRCを無視して展開できるが、破損部分のデータは保証されない

分割ZIPファイル(.z01 / .z02 等)の場合は、すべてのパーツを結合してから展開する必要がある。

# 分割ZIPを結合してから展開 $ cat archive.z01 archive.z02 archive.zip > combined.zip $ unzip -O CP932 combined.zip -d /tmp/extracted_combined/

本記事のまとめ

LinuxでWindowsのZIPを展開した際の文字化け問題は、CP932(Shift_JIS)とUTF-8の文字コードの違いが根本原因だ。状況に応じて次の3つの方法を使い分けよう。

状況 推奨コマンド
RHEL系でこれから展開する unzip -O CP932 filename.zip -d /展開先/
Ubuntu系でこれから展開する unar filename.zip -o /展開先/
すでに文字化けした状態で展開済み convmv -f shift_jis -t utf-8 -r --notest /展開ディレクトリ/
エンコーディングが不明 zipinfo -1 file.zip | nkf --guess で確認後、対処
Bad CRCエラーが出る(破損ZIP) 送信元で再圧縮 / zip -FFで修復 / 7z eで強制展開
再発防止の観点では、WindowsとLinux間でファイルをやりとりする際はUTF-8フラグ対応の圧縮ツール(7-Zip・WinRAR最新版)を使うよう依頼するのが根本的な対策だ。社内でのファイル共有設計を見直す機会があれば、tar コマンドの実用例を参照して .tar.gz 形式(Unix標準)への統一を提案する価値もある。

文字コード・アーカイブ・権限 ── Linux運用の「詰まり」を体系的に解消する

Linuxの運用トラブルの多くは、OS・ファイルシステム・プロセス管理の仕組みを体系的に理解することで自分で原因を特定して対処できるようになります。断片的なコマンド暗記より、現場で再現性のある判断力を身につける方が長期的に効率が高いです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。