cp, ditto, CpMac とゆかいな Finder

October 26th, 2006

技術メモ帳 - MacOSXでのファイルコピーは ditto コマンドを使用した方がいいらしい

hugo-sb 『10.4からは、cpもリソースフォークに対応している筈なんですが。』

というコメントがあって、そういえばそんなことを読んだ気もしたので、深追いしてみた。

初級編

Safari で、アドレスバーの favicon やページ上のリンクを Finder にドロップしてみると、ファイルが作られる。ダブルクリックするとページが開くので、どこかに URI を記録しているはずなんだけど、ファイルの中身は空だ。

% ls -l 8-p.info.webloc
-rw-r--r--   1 kzys  kzys  0 10 26 01:04 8-p.info.webloc

実は URI はリソースフォークに記録されている。

% /Developer/Tools/DeRez 8-p.info.webloc
...
data 'url ' (256, "8-p.info.webloc") {
        $"6874 7470 3A2F 2F38 2D70 2E69 6E66 6F2F"            /* http://8-p.info/ */
};

data 'TEXT' (256, "8-p.info.webloc") {
        $"6874 7470 3A2F 2F38 2D70 2E69 6E66 6F2F"            /* http://8-p.info/ */
};
...

リソースフォークには 8-p.info.webloc/rsrc, 8-p.info.webloc/..namedfork/rsrc でアクセスできる。

% od -c 8-p.info.webloc/rsrc
0000000   \0  \0 001  \0  \0  \0 001   x  \0  \0  \0   x  \0  \0  \0 256
...
% od -c 8-p.info.webloc/..namedfork/rsrc
0000000   \0  \0 001  \0  \0  \0 001   x  \0  \0  \0   x  \0  \0  \0 256
...
% sum 8-p.info.webloc/{rsrc,..namedfork/rsrc} 
22433 1 8-p.info.webloc/rsrc
22433 1 8-p.info.webloc/..namedfork/rsrc

cp, ditto, CpMac, cat でそれぞれコピーしてみる。

% cp 8-p.info.webloc cp.webloc
% ditto 8-p.info.webloc ditto.webloc
% /Developer/Tools/CpMac 8-p.info.webloc CpMac.webloc
% cat 8-p.info.webloc > cat.webloc

それぞれの .webloc をダブルクリックしていくと、エラーになるのは cat.webloc だけなので、cp でもリソースフォークは保存されていることがわかる。

応用編

アイコンについて考える。

% touch a.zip

空ファイルだけど、Finder は拡張子しか見ていないので .zip のアイコンで表示する。ここで Finder 上で右クリックして「このアプリケーションで開く」を変更すると、アイコンも変わる。

どのアプリケーションで開くかはリソースフォークの usro という部分に記録されている。

% /Developer/Tools/DeRez a.zip
data 'usro' (0) {
        $"0000 0030 2F41 7070 6C69 6361 7469 6F6E"            /* ...0/Application */
        $"732F 5374 7566 6649 7420 3130 2E30 2F53"            /* s/StuffIt 10.0/S */
        $"7475 6666 4974 2045 7870 616E 6465 722E"            /* tuffIt Expander. */
        $"6170 7000 9493 94FF 9493 94FF 9493 94FF"            /* app.???????????? */
...

Finder から「このアプリケーションで開く」を変更して a.zip のアイコンが変わったことを確認したら、Finder を開いたまま Terminal からコピーしてみる。

% cp a.zip cp.zip
% ditto a.zip ditto.zip
% /Developer/Tools/CpMac a.zip CpMac.zip
% cat a.zip > cat.zip

cp.zip と cat.zip がアイコンの変化を引き継がない。cat.zip は当然だけど cp.zip が引き継がないのはおかしい。

% killall Finder

ところが、Finder を再起動してみると cp.zip もちゃんとアイコンが変わっている。

結論

  • cp, ditto, CpMac はどれもリソースフォークをみている
  • Finder のキャッシュ的な何かが悪さをしているんだと思う

ちなみに、Mac OS X のソースコードの一部は Apple - Darwin - Releases にあります。公開されているソースすら読まないようでは全然深追いになっていないわけで、深追イストへの道は厳しい。