技術メモ帳 - 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 にあります。公開されているソースすら読まないようでは全然深追いになっていないわけで、深追イストへの道は厳しい。