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でフィルタすれば、混入の有無を一発で確認できます。
|
1 |
unzip -l yourfile.zip | egrep '(__MACOSX|\.DS_Store|\._|Icon\?)' |
何も表示されなければクリーン。表示が出たら混入しています。
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プラグイン向けのコマンド
|
1 2 3 4 5 6 7 |
cd /path/to/parent /usr/bin/zip -r -X my-plugin.zip my-plugin \ -x "Icon?" "*/Icon?" \ -x ".DS_Store" "*/.DS_Store" \ -x "__MACOSX" "*/__MACOSX" \ -x "._*" "*/._*" \ -x "*/.*" |
作ったら必ず確認します。
|
1 |
unzip -l my-plugin.zip | egrep '(__MACOSX|\.DS_Store|\._|Icon\?)' || echo "OK: 余計なファイルは見当たりません" |
確認コマンドで「OK: 余計なファイルは見当たりません」と表示されているターミナル画面
-x "*/.*"はドットファイル全般を除外するパターンです。.htaccessなどドットファイルをプラグインに含める必要がある場合はこの行を外してください。
ditto を使う方法(代替)
macOS標準のdittoコマンドでもクリーンなZIPを作れます。
|
1 |
ditto -c -k --sequesterRsrc --keepParent /path/to/my-plugin my-plugin.zip |
--sequesterRsrcがリソースフォークを隔離するオプションです。ただし.DS_Storeは除外されないので、zip -Xのほうが確実です。どちらを使うにしても、最後にunzip -lで確認するのが大事です。
Automatorでワンクリック化する
結論:Automatorのクイックアクションに登録すれば、Finderで右クリック→1クリックでクリーンなZIPが作れます。毎回ターミナルを開く必要がなくなります。
毎回コマンドを打つのは面倒ですし、打ち間違いのリスクもあります。私はプラグインの更新のたびにZIPを作り直すので、ワンクリック化して以降はミスがほぼゼロになりました。
設定手順
Automatorを起動し、「新規書類」→「クイックアクション」を選択します。「ワークフローが受け取る現在の項目」を「ファイルまたはフォルダ」(検索対象:Finder)に設定します。
Automatorのクイックアクション設定画面(「ファイルまたはフォルダ」選択+シェルスクリプト配置)
アクション一覧から「シェルスクリプトを実行」をドラッグで追加し、「入力の引き渡し」を「引数として」に変更します。以下のスクリプトを貼り付けてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for f in "$@"; do dir="$(dirname "$f")" base="$(basename "$f")" ts="$(date "+%Y%m%d")" zipname="${base// /_}_${ts}.zip" ( cd "$dir" || exit 1 /usr/bin/zip -r -X "$zipname" "$base" \ -x "Icon?" "*/Icon?" \ -x ".DS_Store" "*/.DS_Store" \ -x "__MACOSX" "*/__MACOSX" \ -x "._*" "*/._*" \ -x "*/.*" ) done |
名前を「Clean Zip」などにして保存します。
保存後、Finderでプラグインのフォルダを右クリックすると「クイックアクション」メニューに「Clean Zip」が表示されます。クリックするだけで、フォルダと同じ階層にmy-plugin_20260216.zipのようなファイル名でクリーンなZIPが生成されます。
Finderの右クリックメニューにクイックアクション「Clean Zip」が表示されている画面
既に散らかった._ファイルを掃除する:dot_clean
結論:開発フォルダ内に既に._ファイルが大量にある場合は、macOS標準のdot_cleanコマンドでまとめて掃除できます。
ZIP作成時に除外すればZIP自体はクリーンになりますが、開発フォルダに._ファイルが溜まっていると気持ち悪い。そんなときに使います。
|
1 |
dot_clean /path/to/my-plugin |
dot_cleanはAppleDoubleファイルの内容をネイティブの拡張属性にマージし、._ファイルを削除します。macOS標準コマンドなのでインストール不要です。
特定の._ファイルだけを消したい場合は、findで一覧してから削除するほうが安全です。
|
1 2 3 4 5 |
# まず一覧だけ表示(削除しない) find /path/to/my-plugin -type f -name "._*" -print # 問題なければ削除 find /path/to/my-plugin -type f -name "._*" -delete |
いきなりrm -rfではなく、-printで確認してから-deleteに切り替える。この手順なら誤爆しません。
.gitignoreにも入れておく
結論:.gitignoreに最初からmacOSメタデータを登録しておけば、リポジトリへの混入も防げます。
|
1 2 3 4 5 6 |
# macOS metadata .DS_Store ._* __MACOSX/ Icon? .AppleDouble/ |
GitHubの公式macOS用.gitignoreにはこれらが含まれています。新しいリポジトリを作るときにテンプレートとして選択するだけでOKです。
SVNの場合はsvn propset svn:ignoreで同様の設定ができます。SVNの基本操作やsvn:ignoreの詳しい使い方は「WordPressプラグインを公開して学んだSVNの使い方」で解説しています。
ネットワークドライブに.DS_Storeを作らない設定
結論:NASやSMB共有を使う場合は、defaults writeで.DS_Storeの生成を抑制できます。ただし環境によって効かないケースもあるので、ZIP除外と併用してください。
|
1 2 3 4 5 6 7 8 |
# ネットワーク共有(NAS/SMBなど)に.DS_Storeを作らない defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE # USBなど外部ストレージに.DS_Storeを作らない defaults write com.apple.desktopservices DSDontWriteUSBStores -bool TRUE # Finder再起動(反映) killall Finder |
元に戻すならTRUEをFALSEにして同じコマンドを実行します。
macOSのバージョンや接続方式によっては設定が効きにくいケースが報告されています。「設定したのにまだ.DS_Storeが増える」という場合は、この設定に頼りすぎずzip -Xでの除外をメインにするのが現実的です。
提出前チェックリスト
結論:以下の5項目を毎回チェックすれば、メタデータ混入による事故はほぼゼロになります。
WordPress.orgへのプラグイン提出、SVNへのコミット、クライアントへのZIP納品のどれでも使えるリストです。
|
1 2 3 4 5 |
□ ZIPはFinderの「圧縮」ではなく zip -r -X(またはAutomator)で作ったか □ unzip -l で __MACOSX / .DS_Store / ._ / Icon? が出ないか確認したか □ .gitignore(または svn:ignore)にmacOSメタデータを登録したか □ 開発フォルダに._ファイルが溜まっていないか(必要なら dot_clean) □ NAS/SMB共有を使うなら DSDontWriteNetworkStores を設定したか |
関連記事
WordPressプラグインの提出・公開に関連する記事です。
まとめ
MacでWordPressプラグインのZIPを作るときは、Finderの「圧縮」ではなくzip -r -Xに除外パターンを指定して作れば、.DS_Storeや__MACOSXの混入を防げます。
Automatorのクイックアクションに登録すれば右クリック一発で作れるようになるので、毎回コマンドを打つ手間もなくなります。既に溜まった._ファイルはdot_cleanで掃除し、.gitignoreにmacOSメタデータを登録しておけば、リポジトリへの混入も防げます。
私はこの運用にしてからプラグイン審査でゴミファイルを気にすることがなくなりました。手順を一度固定すると、以後ほとんど意識しなくて済みます。









コメント