ディレクトリのシンボリックリンクでハマったこと

ファイルのシンボリックリンク作成でハマった記憶はあまりないが、ディレクトリでつまづいた。
例えば、リンク元と同名のディレクトリが存在しない状態で以下のコマンド実行、ならうまくいく。

$ ln -s /usr/local/mysql/logs/ /backup/mysql/logs

もしくは、/backup/mysql/がカレントディレクトリとして。

$ ln -s /usr/local/mysql/logs/ logs

が、もし同名のディレクトリが存在する状態で上記コマンドを実行すると、/backup/mysql/logs/
ディレクトリの配下に/usr/local/mysql/logs/のシンボリックリンクができてしまう。

ディレクトリのシンボリックリンクは「/(スラッシュ)」のありなしで挙動が全然違うので、要注意。
例えば、”ln -s /usr/local/mysql/logs/ /backup/mysql/logs/”としてリンク先の最後に/をつけると、
「そのようなファイルやディレクトリはありません」と怒られる。

lsコマンドの結果も変わる。対象のディレクトリのシンボリックリンクに「/」をつけないと、
要するにファイルとしての情報を出力する。
(ディクレクトリの中身ではなくリンクファイルの情報のみ表示される)

$ ls -l /backup/mysql/logs
lrwxrwxrwx mysql mysql 5060 2010-04-10 22:25 logs -> /usr/local/mysql/logs/

後ろに/をつければディレクトリとして認識され、リンク元とおなじ状態で中のファイルが見えている。

$ ls -l /backup/mysql/logs/

、、、今さらながら戸惑う。

ディレクトリのシンボリックリンク削除
ディレクトリのシンボリックリンクを削除しようとしたら、またハマった。
調べると大体どこでもシンボリックリンクを削除するにはrmでいい、と書かれているのだが、、

以下、カレントディレクトリにシンボリックリンクのlogsディレクトリがあるとして。

$ rm logs/
rm: cannot remove ‘logs/’ : ディレクトリです
(ちなみにMacの場合は rm: logs/: No such file or directoryと言われる)

$ rm -rf logs/
rm : cannot remove directory ‘logs/’ : ディレクトリではありません
(Macの場合、エラーは出ないがシンボリックリンクは残っている)

「どういうことっすか!?」軽く混乱してググッた結果、以下のコマンドで普通に消えてくれた。

$ rm logs

リンク元はディレクトリでも、リンク先はファイル扱い、ってことだからか。
これも当然といてば当然かもしれないが、それにしてもこんなところでハマると思わなかった。

ついでに。シンボリックリンクのパーミッションは意味をもたない。
有効なのはリンク元のファイル/ディレクトリのパーミッション、とのこと。
これも今まで意識したことがなく、今さら知った、、、(汗)

最後に。ディレクトリのリネームや移動を行う際は、シンボリックリンク先ではなく、
リンク元実体の場所で行う方がよい。シンボリックリンクであることをうっかり
忘れてリンク先で作業すると、想定外の結果になってしまうことがある。
具体例は、ちょっと割愛するが、、、(これも冷汗的経験)

「失敗」→「調べる」を繰り返すと、多くの発見があるものである。すぐ忘れるけど。