2009-07-24

/Volumes に残ってしまった不要なディレクトリを削除する

Mac OS X では、外付けディスクや USB メモリ、イメージファイルなどを自動でマウントするときに /Volumes に適切なマウントポイントが作られるようになっている。その仕組はともかく(実はよく知らない)、普通はマウントポイントはマウントされるボリュームの名前と同じ名前のディレクトリになる。

また、Mac をシャットダウンしたり、外付けディスクや、USB メモリ、イメージファイルなどを取り外すと、マウントポイントになってたディレクトリも自動的に削除されるようになっている。

ところが、たまに /Volumes の下にマウントポイントになっていたディレクトリが残ることがあって、さらにそのディレクトリになぜか .vbt5などというファイルが残っていて、ディレクトリ自体が残ることがある(空でないディレクトリは削除しないようになってる?)。そうなると、次に同じボリュームをマウントするときには新たに別の名前でディレクトリが作られ、残っていたものは使われないままずぅ〜っとそのままになってしまう。

例えば Logi160 という名前を付けたディスクは普通 /Volumes/Logi160 というディレクトリにマウントされるが、このディレクリがうまく消えてくれないと、次にマウントするときには "/Voluems/Logi160 1" のようなディレクトリにマウントされることになる。ただ、この場合でも Mac のデスクトップに見えるディスクの名前はもともとの Logi160 のまま変わらないので普通は問題になることはない。

ただ、shell script など UNIX よりの世界から POSIX パスに依存してなにかをしようとする場合には当然同じボリュームなら同じところにマウントされるほうが都合がいいわけで、そのために /Volumes の不要なディレクトリを削除する小さなシェルスクリプトを書いてみたわけ。


#!/bin/sh
# $Id: clean_volumes_dir.sh,v 1.2 2009/07/23 16:10:44 rok Exp rok $

OIFS=$IFS
IFS='
'
voldir=/Volumes
cd $voldir

dirs=`ls`
mountpoints=`df | grep $voldir | sed -e 's/.*Volumes\///'`

for dir in ${dirs}; do
if readlink $dir > /dev/null; then
# echo $dir is symlink
continue
fi
dontremove=YES
for mp in $mountpoints; do
if [ "$dir" = "$mp" ]; then
dontremove=NO
break;
fi
done
if [ "$dontremove" = "YES" ]; then
echo rm -r "'"$voldir/$dir"'"
fi
done

IFS=$OIFS

このスクリプトを実行すると、/Volumes にある不要なディレクトリを削除するコマンドを出力するので、それを sh にくべてやればいいようになっている。

実行時に使っているディレクトリは削除しないので、いつ実行しても安全なはず。でも、できれば勝手にやって欲しいとは思うので、システムの終了時に実行するのがいいとは思う。やりかたは…… launchd 使うのだと思うけど、実はまだよく分からない……

1 comment:

Anonymous said...

通りすがりです。
なんだか分からなかった.vbt5を検索して流れ着きました。
参考にさせていただきました。
ありがとうございます。

スクリプトの件ですが、
/.bash_logoutをホームディレクトリに作成して、
ログアウト時にそのスクリプトを実行するようにするのはどうでしょう。
もう既に解決されていたらすみません。では。