Broken linkはどのように作られるか
壊れたシンボリックリンク(Broken link)とはリンク先のファイルが存在しないリンクのことである。
例えばこのように存在しないファイルに対してシンボリックリンクを作成するとBroken linkが作られる。
ln -s はターゲットのファイルが存在するかをチェックしない。
$ ln -s not_exists symlink # not_existsは存在しないファイル
ls -l
total 3
lrwxrwxrwx 1 vagrant vagrant 10 May 2 13:57 symlink -> not_exists
$ file symlink
symlink: broken symbolic link to `not_exists'
作成されたときは正常なシンボリックリンクでも、対象のファイルが削除されるなどするとBroken linkになる。
# リンクされるファイルを作る
$ touch target
# シンボリックリンクを作る
$ ln -s target symlink
# リンク状態を確認
$ ls -l
total 4
lrwxrwxrwx 1 vagrant vagrant 6 May 2 13:34 symlink -> target
-rw-rw-r-- 1 vagrant vagrant 0 May 2 13:33 target
# リンクされたファイルを消す
$ rm target
# シンボリックリンクは残っている
$ ls -l
total 3
lrwxrwxrwx 1 vagrant vagrant 6 May 2 13:34 symlink -> target
# fileコマンドで確認する
$ file symlink
symlink: broken symbolic link to `target'
lsコマンドがカラー表示設定になっていればbroken linkは違う色で表示されるようになっていることが多い。
しかしそうなっていないと、ls -l した時の表示は正常なものと全く同じなのでbroken linkに気づきにくい。
Broken linkを探すコマンド
find コマンドに -L と -type l を与えると壊れたシンボリックリンクだけをリストアップする。
find -L . -type l
使われていないシンボリックリンクを探し出して削除するときに便利だ。
findのmanpageより
- -L
- シンボリックリンクをたどる。
findがファイルの情報を調べたり表示したりする際に、リンク先のファイルのプロパティから取得した情報が使用されることになり、リンクそのものの情報は利用されない (ただし、シンボリックリンクがリンク切れしていたり、findがリンク先のファイルを調べることができなかった場合は除く)。このオプションを使用すると、自動的に-noleafが指定される。後で-Pオプションを指定し直しても、-noleafは依然として有効なままである。
-Lが有効になっているとき、findが探索中にサブディレクトリを指すシンボリックリンクに出会うと、そのシンボリックリンクが参照しているサブディレクトリが探索される。- -type c
- ファイルのタイプが c であれば真。c の位置には実際には
以下の文字が来る。
- b
- ブロック・スペシャルファイル (バッファあり)
- c
- キャラクタ・スペシャルファイル (バッファなし)
- d
- ディレクトリ
- p
- 名前付きパイプ (FIFO)
- f
- 通常のファイル
- l
- シンボリックリンク。オプション-Lや-followが有効な場合、シンボリックリンクがリンク切れの場合を除いて、この判別式が真になることはない。-Lが有効なときにシンボリックリンクを検索したかったら、-xtypeを使うべきである。
- s
- ソケット
- D
- ドア (Solaris の場合)