Classic MacOS9からデータ移行

一時期は古いデータをSheepShaverでエミュレートしたMacOS 9上に集約することに努力を傾けていたのだけれど、どうやらこれ以上は古いデータは見つかりそうにないので、通常環境(Windows)でのバックアップに持ってこようとしている。すると問題が二つ。
一つは画像がPICT形式という、今ではmacOSでもサポートされなくなった形式のものが多数あること。これはGraphicConverterというソフトでJPEGに変換することでなんとかなった。それにしてもエミュレート環境で数千のファイルを処理するなんて、これまではできるかどうか半信半疑の作業が完了できたのはよかった。


もう一つは文字コードの問題。ファイルやフォルダ名に日本語が含まれている場合、MacOS9はWindowsのCP932とはまた別のShiftJIS+αの文字コード体系であったよう。そのため、MacOS9のファイルをイメージディスク上にコピーして、それをHFS/HFS+をマウントできるElCapitanにマウントした場合、マウントは可能なのだけれど、日本語が全て文字化けしてしまう。どうやらOS X Ver10.9あたりまではMacOS9の日本語ファイル名を自動的にUTF8に変換してくれていたようなのだけれど、10.10以降は変換のための関数自体がなくなったそうだ。なので、OS X 10.8をインストールしてその上で作業を行うことにした。ところが10.8からWindows共有サーバにコピーしようとすると、今度はSMBサーバにうまくつながらない。たぶん、SMBのバージョンの問題ではないかと思われるが、追求はしていない。なので、Windows上でIISftpサーバを立ててそこにfilezillaでアップすることにした。今度はうまくいった・・・と思っていたところ、1/5ほどのファイルがアップに失敗とのこと。見ると、97/10/15というようなスラッシュが入ったファイル/フォルダ名のファイルで失敗している模様。調べると、MacOS9まではフォルダの区切り文字はコロン(:)であったため、スラッシュ(/)が含まれたファイル/フォルダ名は許容されていたのが、OS Xになってからはスラッシュはフォルダの区切り文字となるため(ベースがUNIXなので)、表示上はスラッシュのままだけれど、実体としてのファイル名はコロンに変換されている、というややこしいことをしているからであることが分かった。Windowsはファイル/フォルダ名にコロンを許容しないのでftpでうまく転送できなかったわけであった。ということで、ネット検索して下記のようなPerlスクリプトでコロンを-(マイナス)に変換することでWindowsサーバ上にアップ可能となった。ただ、どうやら下記だとタイムスタンプが更新されてしまうようなので、将来的には更新しない形にできれば、と思っている。因みに下記のスクリプトだとフォルダとファイル名の両方が置換対象の場合、うまくいかないのでエラーが出るけれど、実際には長いパスから順番に処理されているのでうまくいっているか、二回実行すればよいかどちらか。

 

use warnings;
use strict;

use File::Find;

my %rename;
find(\&replace_fn, shift);
for my $old (sort { length $b <=> length $a } keys %rename) {
    rename $old, $rename{$old}
    or warn "Cannot rename $old to $rename{$old}.\n";
}

sub replace_fn {
    ( my $new = $File::Find::name ) =~ s{:}{-}g;
    $rename{$File::Find::name} = $new;
}