いまさらシンボリックリンクとハードリンク
シンボリックリンク
$ rm moko1.txt moko2.txt
$ echo 'aaaaa' > moko1.txt
$ ln -s moko1.txt moko2.txt
$ ls -li
16266507 -rw-r--r-- 1 moko staff 6 7 3 17:47 moko1.txt
16266508 lrwxr-xr-x 1 moko staff 9 7 3 17:47 moko2.txt -> moko1.txt
- iノードの値が違う
- ファイル実体は別
- リンクカウントは両方とも1
- ファイル実体は別だしね
- パーミッションの左端が’l’
- リンクだよ!と自己主張している
- ファイル名が矢印でリンクを表している
- 分かりやすいでしょ?みたいな
シンボリックリンクとrm
moko1.txtは削除され、moko2.txt(シンボリックリンク)のみになる
$ rm moko1.txt
moko1.txtは残り、moko2.txt(シンボリックリンク)が削除される
$ rm moko2.txt
シンボリックリンクとrmで最後にスラッシュを付ける
エラー(Not a directory) 何も消えない
rm moko1.txt/
moko1.txtは削除され、moko2.txt(シンボリックリンク)のみになる 正直、直感的な動作ではない
$ rm moko2.txt/
シンボリックリンクとunlink
moko1.txtは削除され、moko2.txt(シンボリックリンク)のみになる
unlink moko1.txt
moko1.txtは残り、moko2.txt(シンボリックリンク)が削除される
unlink moko2.txt
ハードリンク
$ rm moko1.txt moko2.txt
$ echo 'aaaaa' > moko1.txt
$ ln moko1.txt moko2.txt
$ ls -li
16266727 -rw-r--r-- 2 sakamotohidetoshi staff 6 7 3 17:53 moko1.txt
16266727 -rw-r--r-- 2 sakamotohidetoshi staff 6 7 3 17:53 moko2.txt
- iノードの値が同一
- ファイル実体は同じものを指している
- リンクカウントは両方とも2
- ファイル実体へのリンクが2つあるよ、と教えてくれている
ハードリンクリンクとrm
moko1.txtは削除され、moko2.txtのみになる
$ rm moko1.txt
moko2.txtは削除され、moko1.txtのみになる
$ rm moko2.txt
ハードリンクリンクとrmで最後にスラッシュを付ける
エラー(Not a directory) 何も消えない
$ rm moko1.txt/
エラー(Not a directory) 何も消えない
$ rm moko2.txt/
ハードリンクリンクとunlink
moko1.txtは削除され、moko2.txtのみになる
$ unlink moko1.txt
moko2.txtは削除され、moko1.txtのみになる
$ unlink moko2.txt
まとめ
- シンボリックリンクを消す時にrmで行うとシンボリックリンクは残って実体だけ消える(おそらく想定した動作じゃない)場合がある
- シンボリックリンクだろうがハードリンクだろうが、リンクを消したいならunlinkで行え!
メモ
ファイルを消す前にシンボリックリンクが張られてないか気になる時にはこんな感じでイケるんじゃないかと思う Macだとイケそう
$ find / -type l -ls 2>/dev/null | grep moko1.txt
$ find ~ -type l -ls | grep moko1.txt
$ find . -type l -ls | grep moko1.txt
メモ2
シンボリックリンク | ハードリンク |
---|---|
パスで参照 | iノードで参照 |
操作ミスにてリンクだけが残ってしまう可能性 | rmもunlinkも直感的な動作をするように思える |
別のファイルシステムでもイケる | 同一ファイルシステム内に限られる |
ディレクトリでもイケる | 基本ファイルのみ |
元のファイルを移動したらもうダメ | 元のファイルを移動してもイケる(iノードは変わらない) |