MacでZIPに.DS_Storeや__MACOSXが混入するのをzip -Xで防ぐ

MacでWordPressプラグインZIPに.DS_Storeや__MACOSXが混入するのをzip -Xで防ぐ macOS
この記事は約9分で読めます。

Macで.ZIPを作るとき、zip -r -Xコマンドに除外パターンを指定すれば、.DS_Storeや__MACOSXの混入を防げます。Finderの「圧縮」は使いません。

私がこの問題に気づいたのは、Rapls PDF Image Creatorの初回審査でZIPを提出したときでした。Plugin Checkは通ったのに、ZIPの中身をunzip -lで確認したら__MACOSXフォルダと大量の._ファイルが入っていた。審査チームにこんなゴミ付きのZIPを送るのかと思うと冷や汗が出ました。

この記事では、混入する原因、確認方法、防ぎ方、そしてAutomatorでワンクリック化するところまでを解説します。

そもそも何が混入するのか

結論:.DS_Store._ファイル(AppleDouble)、__MACOSXフォルダ、Icon?の4種類です。すべてmacOSが自動生成するメタデータで、悪意のあるファイルではありません。

Finderはフォルダを開くたびに表示設定(アイコンサイズ、並び順、表示形式)を.DS_Storeに保存します。また、拡張属性やリソースフォークを持つファイルを非Mac系のファイルシステムにコピーすると、その情報を._ファイル名という別ファイル(AppleDouble形式)に退避します。Finderの「圧縮」でZIPを作ると、これらのメタデータが__MACOSXフォルダにまとめて同梱されます。

Mac同士のやりとりなら問題にならないのですが、WordPress.orgへの提出、Windows環境での展開、CIでの自動チェックなど「Mac以外が相手」の場面ではノイズになります。

ファイル 正体 何が困るか
.DS_Store Finderの表示設定 Windowsユーザーに「これ何?」と聞かれる
._ファイル名 拡張属性の退避ファイル プラグイン審査でゴミファイル扱いになる
__MACOSX ZIP内のメタデータフォルダ 展開すると謎のフォルダが出現する
Icon? カスタムアイコン情報 まれに混入、見つけにくい

確認方法:自分のZIPが汚れているかチェックする

結論:unzip -lの出力をegrepでフィルタすれば、混入の有無を一発で確認できます。

何も表示されなければクリーン。表示が出たら混入しています。

unzip -lで混入ファイルが表示されているターミナル画面

unzip -lで__MACOSXや.DS_Storeが表示されているターミナル画面

試しにFinderの「圧縮」で作ったZIPを確認してみてください。ほぼ確実に何か出ます。私の場合、プラグインフォルダをFinder圧縮したら__MACOSX配下に12個の._ファイルが入っていました。

解決策:zip -r -X で除外パターンを指定する

結論:ターミナルでzip -r -Xコマンドに-xオプションを付けてZIPを作れば、メタデータを完全に除外できます。Finderの「圧縮」は使いません。

-Xはextra file attributes(拡張属性)をZIPに含めないオプション、-xは除外パターンの指定です。

WordPressプラグイン向けのコマンド

作ったら必ず確認します。

zip -X実行後にunzip -lで確認し「OK: 余計なファイルは見当たりません」と表示されている画面

確認コマンドで「OK: 余計なファイルは見当たりません」と表示されているターミナル画面

-x "*/.*"はドットファイル全般を除外するパターンです。.htaccessなどドットファイルをプラグインに含める必要がある場合はこの行を外してください。

ditto を使う方法(代替)

macOS標準のdittoコマンドでもクリーンなZIPを作れます。

--sequesterRsrcがリソースフォークを隔離するオプションです。ただし.DS_Storeは除外されないので、zip -Xのほうが確実です。どちらを使うにしても、最後にunzip -lで確認するのが大事です。

Automatorでワンクリック化する

結論:Automatorのクイックアクションに登録すれば、Finderで右クリック→1クリックでクリーンなZIPが作れます。毎回ターミナルを開く必要がなくなります。

毎回コマンドを打つのは面倒ですし、打ち間違いのリスクもあります。私はプラグインの更新のたびにZIPを作り直すので、ワンクリック化して以降はミスがほぼゼロになりました。

設定手順

Automatorを起動し、「新規書類」→「クイックアクション」を選択します。「ワークフローが受け取る現在の項目」を「ファイルまたはフォルダ」(検索対象:Finder)に設定します。

Automatorのクイックアクション設定画面(「ファイルまたはフォルダ」選択+シェルスクリプト配置)

Automatorのクイックアクション設定画面(「ファイルまたはフォルダ」選択+シェルスクリプト配置)

アクション一覧から「シェルスクリプトを実行」をドラッグで追加し、「入力の引き渡し」を「引数として」に変更します。以下のスクリプトを貼り付けてください。

名前を「Clean Zip」などにして保存します。

保存後、Finderでプラグインのフォルダを右クリックすると「クイックアクション」メニューに「Clean Zip」が表示されます。クリックするだけで、フォルダと同じ階層にmy-plugin_20260216.zipのようなファイル名でクリーンなZIPが生成されます。

Finderの右クリックメニューにクイックアクション「Clean Zip」が表示されている画面

Finderの右クリックメニューにクイックアクション「Clean Zip」が表示されている画面

既に散らかった._ファイルを掃除する:dot_clean

結論:開発フォルダ内に既に._ファイルが大量にある場合は、macOS標準のdot_cleanコマンドでまとめて掃除できます。

ZIP作成時に除外すればZIP自体はクリーンになりますが、開発フォルダに._ファイルが溜まっていると気持ち悪い。そんなときに使います。

dot_cleanはAppleDoubleファイルの内容をネイティブの拡張属性にマージし、._ファイルを削除します。macOS標準コマンドなのでインストール不要です。

特定の._ファイルだけを消したい場合は、findで一覧してから削除するほうが安全です。

いきなりrm -rfではなく、-printで確認してから-deleteに切り替える。この手順なら誤爆しません。

.gitignoreにも入れておく

結論:.gitignoreに最初からmacOSメタデータを登録しておけば、リポジトリへの混入も防げます。

GitHubの公式macOS用.gitignoreにはこれらが含まれています。新しいリポジトリを作るときにテンプレートとして選択するだけでOKです。

SVNの場合はsvn propset svn:ignoreで同様の設定ができます。SVNの基本操作やsvn:ignoreの詳しい使い方は「WordPressプラグインを公開して学んだSVNの使い方」で解説しています。

ネットワークドライブに.DS_Storeを作らない設定

結論:NASやSMB共有を使う場合は、defaults writeで.DS_Storeの生成を抑制できます。ただし環境によって効かないケースもあるので、ZIP除外と併用してください。

元に戻すならTRUEFALSEにして同じコマンドを実行します。

macOSのバージョンや接続方式によっては設定が効きにくいケースが報告されています。「設定したのにまだ.DS_Storeが増える」という場合は、この設定に頼りすぎずzip -Xでの除外をメインにするのが現実的です。

提出前チェックリスト

結論:以下の5項目を毎回チェックすれば、メタデータ混入による事故はほぼゼロになります。

WordPress.orgへのプラグイン提出、SVNへのコミット、クライアントへのZIP納品のどれでも使えるリストです。

関連記事

WordPressプラグインの提出・公開に関連する記事です。

まとめ

MacでWordPressプラグインのZIPを作るときは、Finderの「圧縮」ではなくzip -r -Xに除外パターンを指定して作れば、.DS_Storeや__MACOSXの混入を防げます。

Automatorのクイックアクションに登録すれば右クリック一発で作れるようになるので、毎回コマンドを打つ手間もなくなります。既に溜まった._ファイルはdot_cleanで掃除し、.gitignoreにmacOSメタデータを登録しておけば、リポジトリへの混入も防げます。

私はこの運用にしてからプラグイン審査でゴミファイルを気にすることがなくなりました。手順を一度固定すると、以後ほとんど意識しなくて済みます。

コメント

タイトルとURLをコピーしました