Macで圧縮したzipが解凍できないときに、最初に切り分ける3つ
ダブルクリックしても、期待したフォルダが出てきません。番号の付いたエラーが出るか、.cpgz という見慣れない拡張子のファイルが隣に増えるか、一瞬何かが動いて何も残らないかのどれかです。mac で圧縮した zip 解凍できないという検索の裏側にあるのは、この3つのうちのどれかで、原因も対処もそれぞれ違います。よく見かける「もう一度ダウンロードしてください」で直るのは、このうちの1つだけです。
先に押さえるべきは、書庫そのものが壊れているのか、書庫は無事で読む側が対応していないのかという線引きです。ここが決まると、残りの候補は数個に絞れます。
圧縮は標準機能なので、失敗の理由が画面に出てこない
macOSの圧縮と展開は、右クリックとダブルクリックだけで完結します。手数が少ないのは利点ですが、途中の処理が見えないぶん、失敗したときに何が起きたのかが画面に残りません。表示されるのは短いエラーか、無言の結果だけです。
受け渡しの経路が増えたことも切り分けを難しくしています。メールの添付、チャットのファイル共有、クラウドストレージの共有リンク、案件ごとのポータルと入口が分かれ、途中で中身が書き換わったり、転送が途中で止まったりする場所が増えました。届いたファイルの拡張子が .zip でも、中身が書庫であるとは限りません。
- サーバーがエラーページを返し、それが
.zipという名前で保存された - 転送が途中で切れ、末尾の目録だけが欠けている
- ブラウザが受信時に自動で展開し、書庫ではないものに元の名前が残った
この3つはどれも「ファイルは存在するのに書庫として読めない」状態を作ります。画面からは同じに見えるので、道具に判定させるのが早道です。
壊れているのか、読めないだけなのかを3つのコマンドで分ける
macOSには最初から判定用の道具が入っています。追加のインストールは要りません。
まず中身の一覧を出します。この操作は書庫の末尾にある目録だけを読みます。
unzip -l 書庫.zip
一覧が正常に出れば、構造は保たれています。転送が途中で切れたファイルはここで失敗し、末尾の目録の signature が見つからないという趣旨のメッセージと、分割された書庫の1つである可能性を示す注意が出ます。このメッセージは、中身が壊れているのではなく、ファイルが最後まで届いていないことの目印です。
次に、各エントリの中身まで検査します。
unzip -t 書庫.zip
問題がなければ、エントリごとにOKが並び、最後に圧縮データにエラーは検出されなかったという要約が出ます。ここで特定のエントリだけが失敗する場合は、転送ではなく元のディスク側で1つのファイルが傷んでいた可能性が高くなります。どのファイルが該当するか分かるので、送り主に必要な範囲だけを頼み直せます。
3つ目は、Finderのダブルクリックが内部で使っているのと同じ経路をたどるコマンドです。
ditto -x -k 書庫.zip 展開先フォルダ
途中で切れたファイルに対しては、pkzipの中央ヘッダを読めなかったという趣旨のメッセージが返ります。ditto が失敗して unzip が通る場合、書庫の外形は無事で、中に入っているものの側に原因があります。
3つを使う順番も決まっています。まず一覧、次に検査、最後に展開です。一覧で落ちたなら中身を調べる意味はなく、ファイルが最後まで届いていない可能性から潰します。一覧が通って検査で落ちたなら、届いてはいるが一部が傷んでいます。どちらも通って展開だけが失敗するなら、原因は書庫の外、つまり展開先の側にあります。
ファイルが最後まで届いたかどうかは、大きさの比較でも確かめられます。送り主に元のファイルサイズを聞き、ls -l で表示されるバイト数と突き合わせます。1バイトでも違えば、その時点で転送の問題だと確定します。厳密に確かめたい場合は shasum 書庫.zip の結果を双方で比べます。同じ文字列が返れば、届いたファイルは送られたものと同一です。
.cpgz が増えるのは、失敗の印ではない
zipを開いたら .cpgz ができ、それを開くとまたzipに戻る、という繰り返しはよく知られていますが、理由はあまり説明されていません。cpgz はエラーを示す拡張子ではなく、macOSの書庫作成に使われる道具が書き出す形式の1つです。実際にその道具をフォルダに対して直接動かすと、zipではなく .cpgz のファイルができます。
つまり .cpgz が現れたということは、道具が「渡されたものを書庫として読めなかったので、書庫を作るほうの仕事をした」という意味になります。開き方を探すのではなく、なぜzipとして読めなかったのかを調べる場面です。原因は前の節で挙げた3つのどれかに収まります。
判定の近道が1つあります。file 書庫.zip を実行すると、名前ではなく先頭のバイト列から種類を判定して表示します。Zip archive data と返れば拡張子は正しく、続けて展開に必要な最低バージョンも表示されます。ただし、途中で切れたファイルも先頭は正しいので、これだけでは最後まで届いたかどうかは分かりません。整合性の検査は別に必要です。
書庫ではなく、展開する側に原因がある場合
Appleの説明は、書庫以外の原因を2つ挙げています。
.zipファイルを開けない場合は、Macに解凍した項目を保存するための十分な領域があることを確認してください。.zipファイルをほかの人から受け取った場合は、ファイルに問題があることがあります。その人にファイルをもう一度圧縮して再送するよう依頼してください。 出典: support.apple.com
空き容量は見積もりを外しやすい項目です。テキストやソースコード、圧縮していない画像は圧縮率が高いため、書庫の数倍の大きさに戻ります。しかも展開中は書庫と結果の両方がディスクに載るので、必要な空きは結果の大きさだけでは足りません。
書き込みの権限も見ておく項目です。読み取り専用でマウントされたディスクイメージやネットワーク共有、あるいは自分のアカウントで書き込めないフォルダの中で展開しようとすると、書庫の問題ではなく権限のエラーで止まります。まずホームフォルダの中で展開して、後から移す手順にすると、この可能性を切り離せます。
ブラウザ経由で受け取ったファイルには隔離の属性が付きます。これは展開を止めるものではありませんが、展開して出てきたアプリが起動しないときの理由になります。展開に失敗したように見えて、実際は展開後の1歩先で止まっている状態です。属性が付いているかどうかは xattr 書庫.zip の出力に com.apple.quarantine が並ぶかで分かります。
展開先のディスクの形式も見ておく項目です。Windowsとの受け渡し用に初期化した外付けドライブは、名前に使える文字の規則がmacOSと違います。書庫の中には問題なく入っている名前でも、その形式のボリュームには書き出せず、途中で止まることがあります。同じ書庫がホームフォルダでは展開できて外付けでは失敗するなら、書庫ではなく行き先の側の話です。
壊れていないのに開けないとき
整合性の検査を通ったのに開けない書庫は、標準の道具が実装していない機能を使っています。ZIPの仕様では、エントリごとに「展開に必要な最低バージョン」が記録され、その値が機能に対応づけられています。仕様書ではDeflate64という圧縮方式が2.1、AESによる暗号化が5.1です。読む側はこの数字を見て、満たせなければそこで止まります。
値は1行で確認できます。
zipinfo -v 書庫.zip | grep -iE "minimum software version|compression method"
ふつうの書庫は低い値と、deflated か stored という圧縮方式を返します。Windowsの圧縮ソフトで強めの設定を選んで作られた書庫は、ここが高い値になっていることがあります。
パスワード付きの書庫も同じ線で分かれます。昔からあるZIPの暗号化なら標準の道具で開けます。一方、AESを使う新しい方式は、macOSに入っているUnZip 6.00が実装していません。この場合、パスワードが間違っているのではなく、そもそも照合まで進んでいません。対応した圧縮ソフトなら同じパスワードで開きます。
大きさの上限も、開けない理由になります。もとのZIPの形式は大きさを4バイトの領域で持つため、1ファイルあたり4GB弱、エントリ数65,535件が上限で、これを超える書庫はZip64という拡張を使います。引っかかりやすいのは件数のほうです。小さなファイルが大量に入るフォルダは、容量の上限より先に件数の上限に届きます。分割するか、書庫ではなくディスクイメージにまとめるかで避けられます。
送り直しを頼むときに、何を伝えるか
切り分けの結果が出たら、送り主への依頼も具体的になります。「開けません」とだけ伝えると、同じ作り方でもう一度圧縮したものが届き、同じ結果になります。
- 転送の途中で切れていた場合。ファイルサイズが合わないことを伝え、経路を変えて送ってもらう。メールの添付で落ちたなら、クラウドストレージの共有リンクに切り替える
- 一部のエントリだけが傷んでいた場合。失敗したファイル名を伝え、その分だけを送ってもらう。全体を作り直す必要はありません
- 展開に必要なバージョンが高かった場合。圧縮ソフトの設定で、圧縮方式と暗号化の方式を標準的なものに変えてもらう。パスワードが要るなら、方式を変えたうえで同じパスワードで作り直してもらう
- 件数や大きさが上限を超えていた場合。分割して送ってもらうか、フォルダ構成を浅くしてもらう
どの依頼も、こちらで調べた事実を1行添えるだけで通ります。相手にとっても、どこを直せばよいかが分かるほうが早く終わります。
切り分けを毎回やるかどうかは、手数で決まる
ここまでの手順は、どれも1行のコマンドです。難しさはありません。面倒なのは、フォルダの表示から離れてターミナルを開き、書庫のパスを打ち直し、結果を読んでまた戻る、という往復のほうです。1個の書庫なら気になりませんが、取引先から毎週届く書庫を毎回調べるとなると、往復の時間が判定そのものより長くなります。
結果として、切り分けは省かれ、送り主に「開けません」とだけ伝えて時間を使うことになります。フォルダとターミナルとAIが同じ窓にある作りは、この往復を無くすためのものです。一覧に出ている書庫に対してそのまま検査のコマンドを打てれば、判定は数十秒で終わります。1つの窓でどこまで扱えるかはできることにまとめてあり、二画面型のファイル管理や転送用のクライアントとの違いは他のファイル管理との比較で整理しています。
判定を仕組みにするなら、一覧と整合性の検査を1本のスクリプトにまとめて、届いた書庫に当てる運用にしておくと、担当者が変わっても同じ結論が出ます。開けない書庫を前にして最初にやるべきことは、送り直しを頼むことではなく、どちらの半分の問題なのかを確かめることです。
よくある質問
zipを開くと `.cpgz` ができるのはなぜですか?
書庫作成に使われる道具が、渡されたファイルを書庫として読めず、代わりに圧縮する側の動作をしたためです。cpgz はその道具が作る形式の1つで、エラーの印ではありません。ダウンロードが途中で切れているか、そもそも書庫ではないファイルであることがほとんどです。
パスワードは合っているのに開けません。何が起きていますか?
AESという新しい方式で暗号化された書庫の可能性があります。macOSに入っているUnZip 6.00はこの方式を実装していないため、パスワードの照合まで進みません。対応している圧縮ソフトを使えば、同じパスワードで開けます。
壊れた書庫と、途中で切れた書庫はどう見分けますか?
unzip -t を実行してください。途中で切れたファイルは、末尾にある目録が届いていないため、目録が見つからないという趣旨のメッセージで止まります。中身が傷んでいる場合は、一覧までは出たうえで特定のエントリが失敗します。
展開できたのにファイル名が読めない文字になっています。壊れていますか?
中身は無事で、名前の読み方だけが食い違っています。古いWindowsの圧縮ソフトで作られた書庫でよく起きます。macOSに入っている unzip には文字コードを指定する選択肢がないため、名前を英数字にして作り直してもらうか、文字コードを選べる圧縮ソフトで展開することになります。