14.4.6 リンク

一つのファイルを,別の場所から別の名前でアクセスできるようにしたい場合があります.このような場合,リンクと呼ばれる機能を使うと便利です.UNIX 系の OS では,ハードリンクシンボリックリンクと呼ばれる複数の種類のリンクがあります.シンボリックリンクの方がよく使われるので,そちらについてまず説明します.

シンボリックリンク

シンボリックリンクは,一見ファイルのように見えるが,実態は「他の場所のファイルやディレクトリの名称を持っているだけのもの」です.シンボリックリンクを作る(しばしば「張る」といいます)には,ln コマンドに -s オプションを渡します.

ln -s (実体の名前) (リンクの名前)return2

「実体の名前」は,リンクが指し示す実体のファイルやディレクトリの名前を書きます.

例えば, カレントディレクトリの bar.txt を,bar-s.txt という名前でも参照できるようにするためにシンボリックリンクを張るには,次のようにします.

ln -s bar.txt bar-s.txtreturn2

すると,bar.txt を確かに bar-s.txt という名前でも参照できるようになりました.片方の内容を変更すると(実体は bar.txt の1つだけなので)もう片方も変更されたように見えるわけです.下の例では echo コマンドで bar.txt の内容を変更していますが,bar-s.txt の内容も同じように変更されていることがわかります.

cat bar.txtreturn2
hogehoge
cat bar-s.txtreturn2
hogehoge
echo fugafuga > bar.txtreturn2
cat bar.txtreturn2
fugafuga
cat bar-s.txtreturn2
fugafuga

ls コマンドで,シンボリックリンクとそうでないファイルは以下のようにして区別できます:

  • -l オプションをつけると,シンボリックリンクは「bar-s.txt -> bar.txt」のようにリンクの指し示すファイル名も表示される.
  • -F オプションをつけると,シンボリックリンクの名前の後ろには @(アットマーク)がつく.

以下がその例です.

ls -l bar-s.txtreturn2
lrwxr-xr-x 1 0000000000 student 7 3 16 16:26 bar-s.txt -> bar.txt
ls -F bar-s.txtreturn2
bar-s.txt@

ディレクトリのシンボリックリンクを張ることもできます.方法はファイルのときと同じです.

ls -Freturn2
bar-s.txt@ bar.txt piyo/
ls piyoreturn2
fuga.txt
ln -s piyo fooreturn2
ls -Freturn2
bar-s.txt@ bar.txt foo@ piyo/
ls fooreturn2
fuga.txt

シンボリックリンクを消す場合は,リンクの方を削除します.リンクを消しても,それが指し示す実体(リンク先)は消えません.しかし,実体のほうを消すと本当にファイルが消えてしまい,せっかく作ったシンボリックリンクは無効になってしまいます.

rm bar.txtreturn2
cat bar-s.txtreturn2
cat: bar-s.txt: No such file or directory

同じように,リンク先のファイルを移動させたり,リンク先の名前を変更させてもシンボリックリンクは無効になります.

ハードリンク

一方,ハードリンクは「ファイルの内容を指し示したもの」「同じデータに対して別名をつけたもの」といえます.シンボリックリンクと同様 ln コマンドを使って作成できますが,-s オプションは渡しません.

ln  (リンク先の名前) (リンクの名前)return2

例えば,次のコマンドは bar.txt のハードリンク bar-h.txt を作ります.

ln  bar.txt bar-h.txtreturn2

なお,ディレクトリのハードリンクは作成できません.

シンボリックリンクは上で見たように,リンクとリンク先に明確な非対称性がありました.それに対しハードリンクではリンクとリンク先とは完全に対等となります.つまり,

  • bar-h.txt の リンク先 bar.txt を消したり移動したりしても,その前と変わらずに bar-h.txt にはアクセスできます.
  • かといって,単なるコピーではなく,1 つのデータを共有しています.言い換えれば,bar.txt, bar-h.txt のどちらか片方を変更すれば,もう片方の中身も同じように変更されます.

これがハードリンクとシンボリックリンクの違いです.