MacでZIPに「._」「.DS_Store」「__MACOSX」が混入する地獄を終わらせる(WordPress審査/USB/NAS対策)

MacでZIPに「_MACOSX」が混入する地獄を終わらせる。 macOS
この記事は約9分で読めます。

MacでWordPressプラグイン審査に出すZIPを作ったり、USBメモリでファイルを受け渡ししたり、NAS/共有フォルダに置いたり……。
そんなときに意図せず混入する「._XXXX」「.DS_Store」「__MACOSX」「Icon?」に、何度も足をすくわれました。

しかもこの手のファイル、自分のMacでは見えにくいのに、Windows側・自動チェック・CI・ZIP展開先で急に目立つ。
「なにこれ?ウイルス?」と聞かれたり、プラグイン審査や納品で気まずくなったり……地味に削られるんですよね。

この記事の対象:Macで「ZIPを配布する/提出する」人(WordPressプラグイン審査、クライアント納品、チーム共有、USB受け渡し、NAS運用など)。

この記事で扱うこと:(1)そもそも何が混ざるのか、(2)混入を減らす設定、(3)増えてしまった分の掃除、(4)ZIP作成時の除外、(5)Automatorでワンクリック化。
最後に「提出前チェックリスト」も置いておきます。

この記事は、僕が実際に困ってきた体験をベースに、“混入させない / できた分を消す / ZIPに入れない”の3方向で、
再現性の高い対策をまとめたものです。最後にAutomatorで右クリック一発ZIPまで作ります。


まず結論:やることはこの3つ(迷ったらここから)

  1. 外付け/共有で作らない設定(.DS_Store対策)
  2. できてしまった「._」をまとめて掃除(dot_clean)
  3. ZIP作成時に除外(zip -X と -x)+ クイックアクション化

おすすめ運用:
普段は「(1) 設定」+「(3) ZIP除外」を標準にして、たまに「(2) 掃除」を回す。これが一番ラクで事故りにくいです。


なぜ起きる?どこで増える?(発生ポイントを先に知ると早い)

よくある状況 増えやすいもの ざっくり理由
SMB/NAS/共有フォルダ .DS_Store / ._* Finder表示情報や拡張属性を保存しようとして生成される
USBメモリ(exFATなど) .DS_Store / ._* Mac固有メタデータを別ファイル(AppleDouble)に退避することがある
Finderの「圧縮」 __MACOSX / ._* ZIPにメタデータ(リソース/属性)を同梱するため
フォルダにカスタムアイコン Icon? アイコン情報が関連ファイルとして見えることがある

「Macで必要な情報」でも、相手の環境では不要で、ZIPや共有でノイズになりやすいのが厄介ポイントです。


現状チェック:あなたのZIPに混ざってるか確認する

まずはZIPの中身を一覧して、混入しているか確認します。

unzip -l yourfile.zip | egrep '(__MACOSX|\.DS_Store|\._|Icon\?)'

表示が出たら混入しています(Windowsの人が見ると、だいたいここで混乱します)。


よく混ざる4種類を超ざっくり解説(読者の不安を消すパート)

  • .DS_Store:Finderの表示状態(並び/表示方法など)を保存するファイル。
  • ._ファイル(AppleDouble):拡張属性やリソースフォークなどの付帯情報を、非Mac系の場所に置くために別ファイルとして作られることがある。
  • __MACOSX:ZIP内でメタデータを保持する目的で作られがちなフォルダ。
  • Icon?:フォルダのカスタムアイコン等に関連して出てくることがある。

ポイントは「悪意あるもの」じゃなく、Macの都合で生まれる“おまけ”だということ。
でも配布/提出物に入るとノイズなので、対策します。


対策A:BlueHarvest系アプリで「作ったら即掃除」運用にする

外付けメディアやNASをよく使うなら、僕はBlueHarvest(表記ゆれがちですが “BlueHarvest” が正式)みたいなアプリが一番ラクでした。

  • 外付け/SD/USB/NASなどの非Mac系ディスクに出がちな「.DS_Store」や「._(AppleDouble)」を自動で消す/掃除する用途
  • ドライブ単位で「このボリュームは常に掃除」みたいな運用にしやすい

「作らない」のが理想ですが、現実はFinder・アプリ・コピー経路で混ざるので、“できたら即消す”が効く場面が多いです。

注意:アプリ導入を避けたい場合は、次の「対策B/C/D/E」だけでも充分戦えます。


対策B:ネットワーク/USBに .DS_Store を作らない(defaults設定)

macOS側で「ネットワークドライブに .DS_Store を作らない」設定ができます。

# ネットワーク共有(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 にします。

defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool FALSE
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool FALSE
killall Finder

ここ重要:
macOSのバージョンや状況によっては、特に外部ストレージ向けの設定が効きにくいケースが報告されています。
「効かないな?」と思ったら、次の dot_cleanZIP除外に寄せるのが現実的です。


対策C:できてしまった「._」をまとめて掃除(dot_clean)

「._」はAppleDoubleという形式で、外部/共有に作られがちです。
この手の掃除で便利なのが macOS標準の dot_clean です。

たとえばUSB(ボリューム名が NO NAME の例)なら:

dot_clean /Volumes/NO\ NAME

フォルダ単位でもOKです(例:共有フォルダ配下だけ掃除)。

dot_clean /path/to/your/folder

ポイント:

  • 外部/共有に大量に増えた「._」を一気に片付けたいときに向く
  • 実行に時間がかかることがあるので、作業の合間に回すのがラク

「dot_cleanが効かない/怖い」場合の最低限(findで削除)

どうしても「._」だけを消したい場合は、まず一覧(-print)で確認してから削除します。

# まずは一覧(削除しない)
find /path/to/target -type f -name "._*" -print

# 問題なければ削除
find /path/to/target -type f -name "._*" -delete

※誤爆が怖いので、いきなり rm -rf しないのがコツです。


対策D:ZIP作成時に「混入させない」— zip -X と -x を使う

Finderの右クリック「圧縮」は便利ですが、ZIP内にメタデータが入り、__MACOSX や ._ を連れてきやすいのが難点です。

ここでおすすめなのが、ターミナルの zip コマンドで、除外パターン(-x)を指定して作る方法。

WordPressプラグインZIP向け(例:フォルダごとzip)

cd /path/to/parent
/usr/bin/zip -r -X rapls-pdf-image-creator.zip rapls-pdf-image-creator \
  -x "Icon?" "*/Icon?" \
  -x ".DS_Store" "*/.DS_Store" \
  -x "__MACOSX" "*/__MACOSX" \
  -x "._*" "*/._*" \
  -x "*/.*"

作った後の確認もセットで:

unzip -l rapls-pdf-image-creator.zip | egrep '(__MACOSX|\.DS_Store|\._|Icon\?)' || echo "OK: 余計なファイルは見当たりません"

別案:ditto でZIPを作る(相性が良い場合あり)

環境によっては ditto を使う例もよく見かけます。
(zipより扱いやすい/メタデータの扱いが良いと感じる人も)

ditto -c -k --sequesterRsrc --keepParent /path/to/folder output.zip

どちらが正解というより、「最終的にZIPが汚れてないこと」が正義です。最後に unzip -l で確認しましょう。


対策E:Automatorで「右クリック一発のクイックアクション」にする

毎回ターミナルを開くのが面倒なら、Automatorのクイックアクションに登録してしまうのが最強です。僕はこれでミスが激減しました。

手順(Automator)

  1. Automator を起動 → 「新規書類」 → 「クイックアクション」
  2. 「ワークフローが受け取る現在の項目」:ファイルまたはフォルダ(Finder)
  3. アクションから「シェルスクリプトを実行」を追加
  4. 「入力の引き渡し」:引数として
  5. 下のスクリプトを貼り付けて保存(例:Clean Zip(Mac隠しファイル除外)

そのまま貼って使えるスクリプト

for f in "$@"; do
  dir="$(dirname "$f")"
  base="$(basename "$f")"
  ts="$(date "+%Y%m%d")"
  zipbase="${base// /_}_${ts}.zip"

  (
    cd "$dir" || exit 1
    /usr/bin/zip -r -X "$zipbase" "$base" \
      -x "Icon?" "*/Icon?" \
      -x ".DS_Store" "*/.DS_Store" \
      -x "__MACOSX" "*/__MACOSX" \
      -x "._*" "*/._*" \
      -x "*/.*"
  )
done

これでFinderで対象フォルダ(例:プラグインのフォルダ)を右クリックして、作ったクイックアクションを叩くだけで、“汚れないZIP”が作れます。


おまけ:Git/SVNにも「混入させない」ガードを入れる

WordPressプラグイン開発なら、.gitignore などに最初から入れておくと安心です。

# macOS metadata
.DS_Store
._*
__MACOSX/
Icon?
.AppleDouble/

SVNでも ignore(svn:ignore)を設定しておくと、うっかり追加を防げます。


最後に:提出前チェックリスト(コピペ用)

  • ZIP作成は Finder「圧縮」ではなく zip/ditto(除外あり)
  • unzip -l__MACOSX / .DS_Store / ._ / Icon? が出ないか確認
  • 共有/NASが多いなら DSDontWriteNetworkStores を入れる
  • 既に散らかったら dot_clean を回す
  • 作業を固定化するなら Automatorクイックアクション でワンクリック化

まとめ:僕のおすすめ運用(最短で事故らない)

  • 普段:zip -r -X … -x … で作る(できればAutomator化)
  • 共有/NASが多い:DSDontWriteNetworkStores を入れる
  • 既に散らかった:dot_clean でまとめ掃除
  • さらにラクしたい:BlueHarvest系で「作ったら消す」運用

「Macだから仕方ない」で終わりがちな話ですが、手順を固定すると、事故がほぼ消えます。
プラグイン審査も、チーム共有も、ZIP納品も、精神衛生がだいぶ良くなりました。

コメント

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