$ ln
link
シンボリックリンクやハードリンクを作成する。
Linux のリンクは、Windows では ショートカット、MacOS では エイリアス と呼ばれる。
-s オプションをつけない場合、ハードリンクを作成することになる。
$ ln リンク元 ハードリンク
$ ln -s リンク元 シンボリックリンク
ハードリンク
データ本体への参照を名前が異なる複数のファイルが共有すること。
Linux のファイルシステムでは、ファイルは ファイル名、データ本体、 inode で構成される。
ハードリンクを作成したファイルは元のファイルと同じ inode を持つため、ファイルシステム上で完全に等価関係にある。
ハードリンクのリンク元、リンク先ファイルは完全に等価。
リンク元、リンク先は区別できない。
ハードリンクは同じファイルシステム内でしか作成できない。ファイルシステム、マウントポイント、パーティションをまたいだファイル間では作成できない。
ディレクトリに対しても作成できない。
ハードリンクは $ ln コマンドを使用して作成する。
$ ln リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
カレントディレクトリ . や、親ディレクトリ .. は、ハードリンクの一つである。
ファイルの削除
ハードリンクが作成されたファイルの データ本体 は、リンク数が 0 になるまでは完全には削除されない。
$ rm コマンドを実行した時、内部ではそのファイル名と inode の紐付けが解除され、これによりリンク数が 1 減少している。さらにリンク数が 0 になった場合にのみ、ファイルのデータ本体と inode が初めて削除(解放)されている。
ファイルのデータ本体はリンク数が 0 になるまで削除されない
シンボリックリンク
リンク元ファイルへのパスを保持する特殊なファイル。
ハードリンク と異なり、異なるネットワーク、ファイルシステム、パーティション間でも作成できる。
シンボリックリンクは元ファイルのデータ本体ではなく、パスを参照するだけなので、元ファイルが削除されるとリンクは壊れてしまう。
$ ln -s リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
ディレクトリに対しても作成することができる。
$ ls -s リンク元ディレクトリ名 リンクディレクトリ名
シンボリックリンクは ls -l コマンド実行時に -> で表示される。
$ ls -l
> lrwxrwxrwx 1 kei kei 5 Jan 30 11:33 file1 -> file1
パーミッション は rwxrwxrwx と表示されるが、実際には リンク元のパーミッションが適用される。
シンボリックリンクのパーミッションは、リンク元のパーミッションが適用される。
リンクのコピー
ハードリンク、シンボリックリンクをファイルコピーした場合、デフォルトではリンク元ファイル(ファイルの実体)がコピーされる。
$ cp リンク コピー先ファイル
ファイルの実体ではなくリンク自体をコピーしたい場合、-d オプションを使用する。
$ cp -d リンク コピー先ファイル
比較
| 特徴 | ハードリンク | シンボリックリンク |
|---|---|---|
| 参照方式 | 同じデータ本体を参照 | パスを参照 |
| inode 番号 | 同じ | 異なる |
| リンク元ファイル削除時の挙動 | リンクが残る限りデータにアクセス可能 | リンク切れになる |
| 制約 | 同じファイルシステム内でのみ作成可能 | 異なるファイルシステムでも作成可能 |
| ディレクトリのリンク | 不可 | 可能 |