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