書き上がった原稿を消してしまいました! そんなときにかぎって、ローカルスナップショット機能を無効化していたという……思い出しながら書き直そうかとも思いましたが、さすがにヤル気が出ません。というわけで、急遽第31回に予定していた内容に差し替えました。幻の第30回、そのうち気が向いたら書くことにします。トホホ。

さて、今回は「zip」について。そんな使い古されたネタをなぜ投入する? と訝しむ声も聞こえてくるようだが、Appleの勢いもあり他プラットフォームからの移住者が後を絶たない現在、需要があるトピックだと認識している。これまで"なんとなく理解していたつもり"の部分を、この際一掃してみては?

「__MACOSX」の意味

OS XのFinderには、専用アーカイバ(BOMArchiveHelper.app)と連携する機能があり、コンテキストメニューから「~を圧縮」メニューを実行すると、そのとき選択しているファイルが圧縮された「アーカイブ.zip」が生成される。展開(解凍)はさらにかんたんで、ダブルクリックするだけだ。

いまでは当然のように利用されている機能だが、OS X 10.3(Panther)以前はそうもいかなかった。旧Mac OS以来利用されてきた、ファイル付属の独自情報をうまく扱う方法がなかったからだ。

Mac OSでは、ファイル本体(データフォーク)のほかに、さまざまなデータを格納できる「リソースフォーク」という部分を伴う。さらに、ファイルを作成/変更/アクセスした日時やコメント、Finder情報などのデータをまとめた「メタデータ」があり、これらが揃ってはじめてFinder上の"ファイル"を再現できる。

しかし、リソースフォークとメタデータはOS X/Finder独自のリソースであり、他のOSでは必要とされない。Appleは、ファイルをデータフォークとそれ以外に2分割するデータフォーマット「AppleDouble」を用意し、OS Xで利用するときには両方を、それ以外の環境で利用するときにはデータフォークとの違いがわかるよう、Finderやアーカイバを整備したのだ。

OS Xで作成したZIPファイルをWindowsで解凍すると、ファイル以外に「__MACOSX」というフォルダが作成される。このフォルダの内容物こそが、AppleDoubleのデータフォーク以外の部分(リソースフォーク+メタデータ)というわけだ。

つまり、「__MACOSX」フォルダはOS Xユーザ以外には関係ない。同じくデータフォーク以外の部分が格納される、先頭が「._」から始まるファイル(AppleDouble Header)も、他のOSでは参照されない。これはなに? とWindowsユーザから質問を受けた場合には、君のところには関係ないから削除してOK、とハッキリ答えよう。

現在のFinderには、かんたんにZIPアーカイブを作成できる機能が用意されているが……

Finder(BOMArchiveHelper)で作成したZIPアーカイブを他のOSで開くと、ほぼ確実に「__MACOSX」フォルダが含まれてしまう

余計な「__MACOSX」を含めないために

しかし、前述した内容はOS Xユーザ側の都合だ。これなんだっけ? と毎回聞いてくる人もいるだろうし(筆者の周囲にも存在する)、余計なモノをつけてくるな! という人もいるだろう。確かに、相手が必要とするものだけを渡すほうが、マナーとしては正しい。

リソースフォークやメタデータを省いてZIPアーカイブを作成するには、Terminalから「zip」コマンドを使うことが近道だ。用法は単純、最初の引数に生成するアーカイブ名(*.zip)を、以降の引数に圧縮対象のファイル/フォルダ名を列挙すればいい。こうして作成したZIPアーカイブは、Windows上で展開しても「__MACOSX」フォルダが現れないはずだ。

ちなみに、tarコマンドでアーカイブ(*.tar.gz/*.tgz)を作成するときは要注意。リソースフォーク/メタデータ付きのファイルを対象にすると、「__MACOSX」フォルダは作成されないものの、AppleDouble Headerは作成されてしまうのだ。気になる場合には、ZIPアーカイブを選択しよう。

$ zip sample.zip file1.png file2.png

このように、zipコマンドで作成したアーカイブには「__MACOSX」フォルダが含まれない

これで「__MACOSX問題」は解決するが、「.DS_Store問題」もお忘れなきよう。フォルダ上のアイコンの位置などが記録されるこのファイルも、他のOSのユーザには無関係で、開けないのはなにか問題が……などと余計な心配をさせてしまう存在だ。

前述したように、圧縮対象がファイルのみの場合は問題ないが、フォルダを対象にすると、必ずといっていいほど「.DS_Store」がアーカイブに混入してしまう。だから、zipコマンドを実行する前に、以下のコマンドを実行し、カレントディレクトリ以下の「.DS_Store」を一括削除しておこう。findとxargsコマンドに関する詳細は本連載の第28回で紹介しているので、そちらもあわせて参照していただきたい。

$ find . -name '.DS_Store' -print0 | xargs -0 rm
$ zip -r sample.zip file1.png file2.png picfolder
関連記事
【コラム】新・OS X ハッキング! (28) 年末特別企画:ホームフォルダを大掃除(2011年12月26日)
【レビュー】NTFSを高速に読み書きできる「Paragon NTFS for Mac OS X 9」(2011年9月23日)
【コラム】新・OS X ハッキング! Lion直前だからこそ、スマートにHDDを健康診断する(2011年6月24日)
【コラム】OS X ハッキング! 第333回 Snow Leopardまで秒読み、だからこそ「Time Machine」でバックアップ(2009年8月24日)
【コラム】OS X ハッキング! 第229回 S.M.A.R.T.にHDDの寿命を監視する(2007年6月8日)