今回を持ちまして、この「OS X ハッキング!」は7年目に突入します。これもひとえに皆さまのご支援のおかげです。怠惰な性質にもかかわらず、よく続いたものだと我ながら感心しちゃいますね。それに、1回も休載していないんですよ。学校でいえば無欠席ってヤツですか。無遅刻ではありませんが……。なにはともあれ、今後ともご愛読をよろしくお願いいたします。

さて、今回はFinderの拡張属性とファイルのメタデータについて。Spotlightの登場と前後し整備が進められてきたが、外観(GUI)の変化を伴わないためか、ユーザの注目が集まりにくかったように思う。それでも重要な進化には変わりはないので、実際にコマンドを実行しながらその意味を確かめてほしい。

EA (Extended Attributes)とは

Leopardの話に入る前に、Tigerで導入されたファイルリソース「EA (Extended Attributes)」について説明しておこう。ACL(Access Common List)もTigerからサポートされたが、デフォルトでは無効化されているため、ここでは省略する。

EAは、メタデータと総称されるファイル付加情報の1つ。ファイル名とパーミッション、ファイル作成日を除くさまざまな情報が記録され、Spotlightによる検索などに用いられる。そもそもHFS Plusは、データフォークとリソースフォーク以外のフォークを確保できるよう設計されていたが、実際には利用されてこなかった。EAが実装されたことにより、ユーザやアプリケーションが自由に、ファイルの本質とは直接関係のない修飾的な情報を保存できるようになったのだ。

EA実装以降のOS Xでは、ファイルのFinder情報やリソースフォークもEAの一種として扱われるよう、仕切り直しが行われた。Finder情報は「com.apple.FinderInfo」、リソースフォークは「com.apple.ResourceFork」、その他の情報は「com.apple.metadata」という名のEAの一部として、システムコールから利用できるようになった。これが、cpmvなどのUNIXコマンドが一斉にリソースフォークを扱えるようになった理由だ。

ところで、EAとメタデータは混同されがちなため、ここで整理しておきたい。メタデータとは、EAやリソースフォークを含む「広義のファイル付加情報」で、ファイルに埋め込まれている独自情報も含まれる。EAはTigerで実装されたHFS Plus独自の機構であり、ファイル本体とは別に存在するため、HFS Plus以外のファイルシステムへコピーすると原則して失われる(通常は「AppleDouble」の機能により、EAは「._元のファイル名」という形式の別ファイルに書き出されるが)。

余計混乱したかもしれないので、JPEGファイルを例に補足説明しておこう。たとえば、JPEGファイルに埋め込まれたEXIFはメタデータだが、EAではない。どのファイルシステムへコピーしようと、PantherやJaguarで開こうと、機種名やGPSデータが失われないことがその証拠だ。一方、カスタムアイコンや画像の解像度などの情報は、EAの内容をクリアすることにより消えてしまう。

なお、EAへの完全移行は当分先のこと。LeopardでもTigerのときと同様、Finderコメント(Spotlightコメント)が.DS_Storeに記録されることから伺えるように、以前のシステムとの互換性を保つ仕組みはしばらく残りそうだ。

EAの内容を調べる

そのEAは、Leopardに追加された「xattr」コマンドで確認できる。実体はPythonで記述された短いスクリプトだが、EAの存在を知るには十分な機能を備えている。

利用方法はかんたん、コマンドの引数に調べたいファイルのパスを指定すればOK。ただし、デフォルトではEAに存在するエントリ名しか表示されないため、「-l」オプションを使い、内容をダンプするといいだろう。

$ xattr -l pic1.png

xattrコマンドでPNGファイル(スクリーンショット)のEAを表示したところ

このxattrコマンドを使えば、EAにメタデータを追加することもできる。「-w」オプションに続けて、「com.apple.metadeta:メタデータのキー キーワード ファイル名」の要領で指定すればOKだ。次の例のように、Finderの情報ウインドウを開くことなくFinderコメントを追加する、といった用途に使えそうだ。

$ xattr -w com.apple.metadata:kMDItemFinderComment Pogemuta pic1.png

第250回でも触れたが、LeopardのlsコマンドはEAに対応している。EAの有無は、「-l」オプションを有効にして詳細情報付きで表示したとき、パーミッションフィールドに「@」があるかどうかで確認できる。

-@」オプションも有用だ。「ls -l@」のように「-l」オプションとセットで利用することにより、EAのリストを表示できる。以下のスクリーンショットからは、リソースフォークが「com.apple.ResourceFork」として参照可能なことが読み取れるはずだ。

-@」オプション付きでファイルの詳細リストを表示したところ