# 17.6.5. リンク
**Source**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/fs/links/
**Parent**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/email/
一つのファイルを、別の場所から別の名前でアクセスできるようにしたい場合があります。このような場合、リンクと呼ばれる機能を使うと便利です。UNIX 系の OS では、**ハードリンク**と**シンボリックリンク**と呼ばれる複数の種類のリンクがあります。シンボリックリンクの方がよく使われるので、そちらについてまず説明します。
## シンボリックリンク [#](#symlink)
シンボリックリンクは、一見ファイルのように見えるが、実態は「他の場所のファイルやディレクトリの**名称**を持っているだけのもの」です。シンボリックリンクを作る(しばしば「張る」といいます)には、`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
> ```
同じように、リンク先のファイルを移動させたり、リンク先の名前を変更させてもシンボリックリンクは無効になります。
## ハードリンク [#](#hardlink)
ハードリンクは、シンボリックリンクとほぼ同様ですが、作成されたファイルと元の実体のファイルは同等になります。
作成方法は同じ `ln` コマンドで、`-s`オプションは使いません。
ln (実体のパス) (新しいファイル名)
例えば、次のコマンドは `english.txt` のハードリンク `engelsk.txt` を作ります。
ln english.txt engelsk.txt
なお、ディレクトリのハードリンクは作成できません。他にも異なるディスクパーティションをまたげないなど制限があります。
- engelsk.txt の リンク先 english.txt を消したり移動したりしても、その前と変わらずに engelsk.txt にはアクセスできます。
- かといって、単なるコピーではなく、1 つのデータを共有しています。言い換えれば、english.txt, engelsk.txt のどちらか片方を変更すれば、もう片方の中身も同じように変更されます。
これがハードリンクとシンボリックリンクの違いです。