リンク

16.6.5. リンク

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

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

ln -s (実体のパス) (偽物のパス)

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

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

ln -s english.txt eigo.txt

すると、english.txt を確かに eigo.txt という名前でも参照できるようになりました。

cat english.txt
hogehoge
cat eigo.txt
hogehoge

片方の内容を変更すると(実体は english.txt の1つだけなので)もう片方も変更されたように見えるわけです。下の例では echo コマンドで english.txt の内容を変更していますが、eigo.txt の内容も同じように変更されていることがわかります。

echo fugafuga > english.txt

cat english.txt
fugafuga
cat eigo.txt
fugafuga

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

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

以下がその例です。

ls -l eigo.txt
lrwxr-xr-x 1 0000000000 student 7 3 16 16:26 eigo.txt -> english.txt
ls -F eigo.txt
eigo.txt@

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

ls -F
eigo.txt@ english.txt piyo/

ls piyo
fuga.txt
ln -s piyo foo

ls -F
eigo.txt@ english.txt foo@ piyo/
ls foo
fuga.txt

シンボリックリンクを消す場合は、リンクの方を削除します。リンクを消しても、それが指し示す実体(リンク先)は消えません。

実体のほうを消すと本当にファイルが消えてしまい、せっかく作ったシンボリックリンクは無効になってしまいます。 以下は本物を消してしまった失敗例です。

rm english.txt
cat eigo.txt
cat: eigo.txt: No such file or directory

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

ハードリンクは、シンボリックリンクとほぼ同様ですが、作成されたファイルと元の実体のファイルは同等になります。 作成方法は同じ ln コマンドで、-sオプションは使いません。

ln  (実体のパス) (新しいファイル名)

例えば、次のコマンドは english.txt のハードリンク engelsk.txt を作ります。

ln  english.txt engelsk.txt

なお、ディレクトリのハードリンクは作成できません。他にも異なるディスクパーティションをまたげないなど制限があります。

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

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

パーミッションと実行ファイル リンク 複数ファイルの指定・ファイルの検索