一つのファイルを,別の場所から別の名前でアクセスできるようにしたい場合があります.このような場合,リンクと呼ばれる機能を使うと便利です.UNIX 系の OS では,ハードリンクとシンボリックリンクと呼ばれる複数の種類のリンクがあります.シンボリックリンクの方がよく使われるので,そちらについてまず説明します.
シンボリックリンク
シンボリックリンクは,一見ファイルのように見えるが,実態は「他の場所のファイルやディレクトリの名称を持っているだけのもの」です.シンボリックリンクを作る(しばしば「張る」といいます)には,ln コマンドに -s オプションを渡します.
ln -s (実体の名前) (リンクの名前)
「実体の名前」は,リンクが指し示す実体のファイルやディレクトリの名前を書きます.
例えば, カレントディレクトリの bar.txt を,bar-s.txt という名前でも参照できるようにするためにシンボリックリンクを張るには,次のようにします.
ln -s bar.txt bar-s.txt
すると,bar.txt を確かに bar-s.txt という名前でも参照できるようになりました.片方の内容を変更すると(実体は bar.txt の1つだけなので)もう片方も変更されたように見えるわけです.下の例では echo コマンドで bar.txt の内容を変更していますが,bar-s.txt の内容も同じように変更されていることがわかります.
cat bar.txt
hogehogecat bar-s.txt
hogehogeecho fugafuga > bar.txt
cat bar.txt
fugafugacat bar-s.txt
fugafugals コマンドで,シンボリックリンクとそうでないファイルは以下のようにして区別できます:
- -l オプションをつけると,シンボリックリンクは「bar-s.txt -> bar.txt」のようにリンクの指し示すファイル名も表示される.
- -F オプションをつけると,シンボリックリンクの名前の後ろには @(アットマーク)がつく.
以下がその例です.
ls -l bar-s.txt
lrwxr-xr-x 1 0000000000 student 7 3 16 16:26 bar-s.txt -> bar.txtls -F bar-s.txt
bar-s.txt@ディレクトリのシンボリックリンクを張ることもできます.方法はファイルのときと同じです.
ls -F
bar-s.txt@ bar.txt piyo/ls piyo
fuga.txtln -s piyo foo
ls -F
bar-s.txt@ bar.txt foo@ piyo/ls foo
fuga.txtシンボリックリンクを消す場合は,リンクの方を削除します.リンクを消しても,それが指し示す実体(リンク先)は消えません.しかし,実体のほうを消すと本当にファイルが消えてしまい,せっかく作ったシンボリックリンクは無効になってしまいます.
rm bar.txt
cat bar-s.txt
cat: bar-s.txt: No such file or directory同じように,リンク先のファイルを移動させたり,リンク先の名前を変更させてもシンボリックリンクは無効になります.
ハードリンク
一方,ハードリンクは「ファイルの内容を指し示したもの」「同じデータに対して別名をつけたもの」といえます.シンボリックリンクと同様 ln コマンドを使って作成できますが,-s オプションは渡しません.
ln (リンク先の名前) (リンクの名前)
例えば,次のコマンドは bar.txt のハードリンク bar-h.txt を作ります.
ln bar.txt bar-h.txt
なお,ディレクトリのハードリンクは作成できません.
シンボリックリンクは上で見たように,リンクとリンク先に明確な非対称性がありました.それに対しハードリンクではリンクとリンク先とは完全に対等となります.つまり,
- bar-h.txt の リンク先 bar.txt を消したり移動したりしても,その前と変わらずに bar-h.txt にはアクセスできます.
- かといって,単なるコピーではなく,1 つのデータを共有しています.言い換えれば,bar.txt, bar-h.txt のどちらか片方を変更すれば,もう片方の中身も同じように変更されます.
これがハードリンクとシンボリックリンクの違いです.