Friday 6 August 2010

alias on HFS+

iPhotoとかiTunesには、読み込んだファイルの場所を移動せずに、alias でiPhoto/iTunes 側に持つと言う機能があります。普段は、そんなの使ってないです。なんだけど、この前、iPhotoをまとめる時に、そうしちゃったんだよね。

Unix FSには、symbolic link と hard link がある。前者は file の名前を参照する機能、後者は一つのファイルをi-node と言う番号で複数の名前でアクセス出来る機能。じゃぁ、alias って何なの? どっちでもないらしいです。

その証拠にHFS+の alias された file は、ls -l で見れない。cat も出来ない。もちろん、cp もダメ。rsync とか ditto とかは動くんだけど、コピーした先は、やっぱり alias。

どうも、HFS+の中のunique idを使って参照しているらしい。file の実体は、alias したファイルらしい。でも、

 link count

と言う概念はないので、実体を消すと alias からアクセス出来なくなるらしいです。ファイルの場所を見せない symbolic link みたいなものらしい。一旦、alias を握ってしまえば、file が移動されても参照できるってのは、hard link に近い。でも、消されてしまうと消えちゃう。hard link の場合は、自分が参照している限り残る。ま、いろんな機能があるね。

でも、alias で一つのiTunesに入っちゃったので、折角統一したのに、元のが消せない。そっちを消すと alias 側も消えるから。おーぃ。

iTunes には「ライブラリを整理する」って言う機能があるんですが、iPhotoにはない。再読み込みするって言う手もあるんですが、それやるとアルバムとか縦横の情報が消えます。良くできてるね。

なのでしょうがないので、alias の参照先をditto でcopyするってのを考えたんですが、ls で見れないのをどうすれば良いわけ?

で、また、AppleScript と格闘しました。Finder で、original item of f みたいなことが出来るようです。

  osascript \
  -e 'on run argv' \
  -e 'set p to item 1 of argv' \
  -e 'set f to POSIX file p' \
  -e 'tell application "Finder"' \
  -e 'set al to f as alias' \
  -e 'try' \
  -e 'set o to original item of al' \
  -e 'URL of o' \
  -e 'on error' \
  -e 'URL of al' \
  -e 'end try' \
  -e 'end tell' \
  -e 'end run' $* | perl -lp -e 's=file://localhost==;' -e 's/\%([0-9A-z][0-9A-z])/pack("H*",$1)/eg'
ってな感じで出来るらしい。最後の perl は、URL から、Unix 名を復帰しているだけです。

Finder で delete / copy までするべきな気もするが、3万枚だからなぁ。で、後は、shell script を生成して実行と。2時間かかったけど、そんなものだろう。

http://www.ie.u-ryukyu.ac.jp/%7Ekono/pub/software/get-original

http://www.ie.u-ryukyu.ac.jp/%7Ekono/pub/software/copy-alias.pl

ま、もっと簡単な方法もあるでしょう。

No comments: