2007-02-09

Mailboxes のお掃除

たぶん、Mac OS X のバージョンが 10.4 (Tiger) になった頃から Mac OS X の標準の電子メールアプリケーションである Mail.app は受信したメールを、一件につきファイルひとつを使って管理している。Tiger から導入された Spotlight の検索機能を有効に使うためだと思う。それ以前は、メールの本体は mbox という一つのファイルにメールフォルダ単位でまとめて(その他インデック用などのいくつかのファイルと一緒に)保存されていた。

この管理方式の切替は、OS をアップグレードしていくと自動で行なわれるようになっている(と思う)。Tiger にバージョンアップしたあとで、Mail.app を起動して、あるメールフォルダを覗くとその時点で mbox 型式から、1メール 1ファイルの型式に自動的に変換されるのだろう。

で、その変換前の mbox と関連ファイルがそのまま残ってしまう場合がある。というか、自分のところはしっかり残っている。これらのファイルは変換後は一切使われないようなので(それまでのバックアップとしての意味はある)、正常な動作が確認された段階で削除してもかまわないはず。で、調べてみたんだけれど自分の場合は関連する mbox、mbox,SKindex、mbox.SKindex.isValid、Incoming_Mail、 Incoming_Table_of_Contents、table_of_contents などのファイルが、数にして約450個、ファイル容量にして約600MBもあった。もっとも、先に大きなものは手動で削除してしまったので実際には 1GB くらいはあったのだと思う。

さっくりとこれらを削除するシェルスクリプトを書いて……と書きたいところだれど、けっこう手間取ってしまった。何度かテストで実際に削除する代りにバックアップも兼ねて、他のフォルダに該当ファイルをコピーするようにしたときに、移動したはずのファイルの数が合わなかったりして。要はファイル名の問題で、メールフォルダに「Somebody's mails 」みたいに、空白とかシングルクオートとかを混ぜてしまったものがいくつかあったので、これを回避する必要があったということで、これに気付くのにちょっと時間がかかった。本来ならスクリプト側で吸収すべきところだけど、結局はフォルダの名前を変更することで手抜きの対応で済ませてしまった(どうせ一回しか使わないし)。

ちなみにこんなヘタレscript。このスクリプトも例によって無保証です。実行結果については一切責任をもちません。使ってみようかなという方は、自己責任のもとでどうぞ。


#!/bin/sh

[ "${BackupDir}" ] || BackupDir=${HOME}/tmp/MailBackup
Mailboxes=${HOME}/Library/Mail/Mailboxes

echo "#!/bin/sh"

find ${Mailboxes} -type d -a -name '*.mbox' -print | \
while read mb; do
[ -f "${mb}/mbox" \
-o -f "${mb}/mbox.SKindex" \
-o -f "${mb}/mbox.SKindex.isValid" \
-o -f "${mb}/table_of_contents" \
-o -f "${mb}/Incoming_Mail" \
-o -f "${mb}/Incoming_Table_of_Contents" ] \
&& echo mkdir -vp "'${BackupDir}${mb}'"
for f in \
mbox \
mbox.SKindex \
mbox.SKindex.isValid \
table_of_contents \
Incoming_Mail \
Incoming_Table_of_Contents \
`basename $mb`.tmp
do
[ -f "${mb}/${f}" ] \
&& echo mv -v "'${mb}/${f}'" "'${BackupDir}${mb}/'"
done
done

自分は怖がりなので、いきなり削除 はしない。このスクリプトを実行すると、削除対象になるファイルを~/tmp/MailBackup 以下に移動するスクリプトを出力するになっている(たとえば 「./THIS_SCRIPT.sh > move_files.sh」を実行すれば move_files.sh というファイルができる。(中味を吟味したうえで)さらにそのファイルを sh で実行すれば、~/tmp/MailBackup 以下に削除すべきファイルが移動する。そのあとで Mail.app の動作を確認できれば ~/tmp/MailBackup 以下は削除していいことになる。

注意: 前述のようにファイル名については特に注意が必要。スクリプトの mv を cp に変更して予め実行してみるなど、もとのメールフォルダをいじらないでちゃんと動作するかを確認してから本番にうつること。できれば ~/LIbrary/Mail 以下のフルバックアップを取っておくこと。


追加の注意: mbox から Tiger 以降のファイル管理方式への変換は、そのメールフォルダを開かないと起こらないようなので、予め全てのメールフォルダを Mail.app で開いておくこと。そうしないと、Tiger になって一度も覗いたことのないメールフォルダの中味が失われてしまう可能性があある。


なんとなくスッキリはしたけど、今時 600MB 空いても焼け石に水だなぁ。

No comments: