So-net無料ブログ作成

Windows非互換ファイル削除アプリ - その2 [プログラミング]

「Windows非互換ファイル削除アプリ」作るいきさつを書いた。今日はそれを実現する技術的なポイントのひとつめについて。

2  ファイルのメタデータ

unixでは歴史的にパーミッションやタイムスタンプなどといった生のデータ以外のメタデータをファイルの属性として保存してきた。Macでは最初からもっと多くのメタデータをファイルに追加してきた。Macではそういったメタデータを保存するために専用のHFSというファイルシステムが作られて、今のMac OS Xでも拡張されながら使われている。

OS9以前ではタイプとクリエータという情報を持っていて、使い勝手の良さに貢献していた。また、すべてのファイルにはリソースフォークとデータフォークという2種類のスペースが用意されていた。

データフォークはごく普通のアプリデータを収納する場所で、たとえばテキストエディタで作成したテキストデータなどを保存した。

リソースフォークはデータ型の決まった情報を収納する場所で、たとえば使っているフォントの指定や開いたときのウィンドウの位置や大きさなどOSが一般的に使っているデータ型、あるいは専用のツールで定義したデータ型であれば自由に収納できた。これはもともとのMac OSがpascalで記述されていた影響である。pascalはデータ型にうるさく、厳密な扱いが必要だけど、構造化されたデータを安全に扱うことができる。古いMac OSではそれをファイルまで拡張してファイル上のデータも構造化することで安全かつ効率的なアクセスを実現していた。古いMac OSのアプリが作るファイルでは、リソースフォークにはいろいろ入っているけど、データフォークはからっぽというのが多くあった。

そういうファイルをWindows専用のファイルシステムにコピーしようとするといろいろ問題が起きる。FATにはそういったメタデータを保持する領域が存在しない。NTFSにはいちおうフォークをサポートする機能があるが、当然Macのリソースフォークを解釈することはなくすべて無視されるので、あっても無意味である。

一方Mac OS側ではFATに保存したデータを読み出すときに一部のデータが失われるような事態は避けたい。今のMac OS Xでは苦肉の策でunixらしい解決をしてしまった。つまり、リソースフォークを別の独立したファイルにして保存することにした。たとえば
text.txt
というファイルを作ると、データフォークはこのファイルに、そしてリソースフォークは
._text.txt
というファイルにまとめて保存される。
unixでは「.」で始まるファイルはそのままでは表示されない、という約束になっている。カレントディレクトリを現す「.」、その親を表す「..」に始まって.cshrcなどの多くの設定ファイルなんかはいちいち表示する必要がないのでこうなっていることが多い。

ところがWindowsではそのunixのお約束は通用しない(Windows7はデフォルトでは表示されなくなったらしい)ので、Mac OS Xで作ったファイルをFATボリュームにコピーして、Windowsにマウントするとわけわからんファイルがいっぱいある、ということになる。

さらにMac OS Xでは「.」で始まるファイルをいろいろ作ってしまう。ファインダ専用のメタデータの.DS_Storeは、フォルダ(ディレクトリ)を表示したときのウィンドウの位置や大きさ、配列などを保存している。フォルダを一度ファインダで表示すると(実際には表示した後なんらかの操作をすると)、そのフォルダに必ず作られる。

ほかにも、ボリュームのトップレベルにはスポットライト用のメタデータが収納された.Spotlightや、ゴミ箱に対応するフォルダである.Trashesなどが作られる。
こういったファイルやフォルダはWindowsでは何の役にも立たないのに、Windowsで表示するとその時に限ってぞろぞろと並ぶことになる。MacとWindowsでデータをやり取りするうえでの障害、というほどではないにしてもWindows側では何の役にも立たず、わずらわしいことには間違いない。

3  findコマンド

unixにはちょっとした多くのコマンドがある。簡単なコマンドを組み合わせて複雑な作業をこなせるようにしよう、というunixの思想が反映した結果である。ひとつひとつはたいしたことはないけど、パイプでつないでいろいろなことができる。このおかげでunixではかゆい所に手が届くということがよくある。

その中で異質に高機能なコマンドがfindである。使うときのシンタクスも一般のコマンドと微妙に違う。 findコマンドはディレクトリを再帰的にたどってファイルを探し出す。たとえば
% find . -type d
とすると、カレントディレクトリ以下のディレクトリ全部をリストアップする。
指定した名前や属性にマッチしたファイルを探すだけでなく、見つかったファイルに対して別のコマンドを与えることができる。たとえば
% find . -name "._*" -exec rm {} \;
とすればディレクトリの下をたどりながら「._」で始まるファイルを探し出してrmコマンドで削除する、ということができる。文字の置き換えやshellのエスケープのためのクォートやバックスラッシュがごちゃごちゃしているが、これはまあしかたない。詳細はmanページなどを参照してほしい。

もうすでに種明かしになっているが、この一行でリソースフォークの入ったファイルを消去することができる。ディレクトリの深い底の方にあるファイルであってもこの一行でいい。簡単。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0