【コマンドライン】ハードリンクとシンボリックリンクの作成 [ ln ]
コマンドラインでハードリンクやシンボリックリンクを作成するlnコマンドについて解説します。
検証環境
リンク
リンクは“データの関連付け”です。
リンクは主にハードリンクとシンボリックリンクの2種類あります。
仕組みを理解するにはファイルシステムの知識が必要ですが、ここでは簡易的に説明します。
ハードリンク
ハードリンクはデータへの直接的なリンクです。
1つのデータに対して複数のハードリンクを作成可能で、各リンクは同一のデータに関連付きます。
データはハードリンクが1つでも存在する間は削除されません。
シンボリックリンク
シンボリックリンクはデータへの間接的なリンクです。
1つのデータに対して複数のシンボリックリンクを作成可能で、WindowsやMacOSなどのショートカットのイメージです。
リンク先のファイルが削除された場合、データが残っていてもアクセスできなくなります。
リンクの確認方法
ハードリンク・シンボリックリンクを確認するにはlsコマンドとfindコマンドを使用します。
ハードリンク
リンク(ファイル)はi-nodeと呼ぶメタデータを持ちます。
このi-nodeのIDが同じリンクは同一データに紐づくハードリンクになります。
例えば、次のようなケースです。
___ih_hl_start
$ ls -i
___ih_hl_end
386043 hl-sample.txt 386043 memo.txt 386042 sl-sample.txt
lsコマンドの-iオプションはi-nodeのIDを表示するオプションです。
この場合、hl-sample.txt
とmemo.txt
は386043
であるため、同じデータへのハードリンクであることが分かります。
また、i-nodeのIDからハードリンクを検索するにはfindコマンドの-inumオプションを使用します。
-inumオプションは指定したi-nodeのIDで検索するオプションです。
___ih_hl_start
$ find ./ -inum 386043
___ih_hl_end
./hl-sample.txt
./memo.txt
シンボリックリンク
シンボリックリンクはlsコマンドと-lオプションでファイル種別を表示し確認します。
___ih_hl_start
$ ls -l
___ih_hl_end
-rw-rw-r-- 2 hacker staff 13 8月 27 15:48 hl-sample.txt
-rw-rw-r-- 2 hacker staff 13 8月 27 15:48 memo.txt
lrwxrwxrwx 1 hacker staff 8 8月 27 15:48 sl-sample.txt -> memo.txt
ファイル種別がlとなるファイルがシンボリックリンクとなり、この場合はsl-sample.txt
がシンボリックリンクです。
また、リンク先(参照先)はファイル名の後の->
に続くmemo.txt
の部分になります。
lnコマンド
lnコマンドはハードリンクまたはシンボリックリンクを作成します。
基本書式
$ ln [オプション] [リンク元] [リンク名]
オプション
主なオプションは次の通りです。
オプション | 内容 |
---|---|
-s | シンボリックリンクで作成 |
引数
リンク元
リンク元はリンクを作成するディレクトリまたはファイルのパスです。
リンク名
リンク名はリンクの名称です。
実行例
ファイル / ハードリンク
$ cat memo.txt
Hello World!
___ih_hl_start
$ ln memo.txt hl-sample.txt
___ih_hl_end
$ ls -i
386043 hl-sample.txt 386043 memo.txt
$ cat hl-sample.txt
Hello World!
memo.txt
が示すデータのハードリンクhl-sample.txt
を作成しました。
同じデータを示すため、一方からデータを変更すると他方も変わります。
$ echo "Good Morning." > memo.txt
$ cat memo.txt
Good Morning.
$ cat hl-sample.txt
Good Morning.
また、一方を削除してもハードリンクが1つ以上存在するデータは削除されません。
$ ls -i
386043 hl-sample.txt 386043 memo.txt
$ rm memo.txt
$ ls
hl-sample.txt
$ cat hl-sample.txt
Good Morning.
ファイル / シンボリックリンク
$ cat memo.txt
Hello World!
___ih_hl_start
$ ln -s memo.txt sl-sample.txt
___ih_hl_end
$ ls -i
386051 memo.txt 386042 sl-sample.txt
$ cat sl-sample.txt
Hello World!
memo.txt
のシンボリックリンクsl-sample.txt
を作成しました。
一方からデータを変更すると他方も変わります。
$ echo "Good Morning." > memo.txt
$ cat memo.txt
Good Morning.
$ cat sl-sample.txt
Good Morning.
また、シンボリックリンクは参照元を削除するとデータが残っていてもアクセスできなくなります。
$ ls -li
386052 -rw-rw-r-- 2 hacker staff 13 8月 27 16:41 hl-sample.txt
386052 -rw-rw-r-- 2 hacker staff 13 8月 27 16:41 memo.txt
386042 lrwxrwxrwx 1 hacker staff 8 8月 27 16:34 sl-sample.txt -> memo.txt
$ rm memo.txt
$ cat sl-sample.txt
cat: sl-sample.txt: そのようなファイルやディレクトリはありません
$ cat hl-sample.txt
Hello World!
memo.txt
とhl-sample.txt
は同じデータを示すハードリンクです。
そのため、memo.txt
を削除しても、hl-sample.txt
が存在するため、データは残ります。
しかし、sl-sample.txt
はmemo.txt
のシンボリックリンクのため、このサンプルのようにアクセスできなくなります。
ディレクトリ / ハードリンク
ディレクトリのハードリンクは作成できません。
ディレクトリ / シンボリックリンク
$ ls tmp
memo.txt
___ih_hl_start
$ ln -s tmp sample
___ih_hl_end
$ ls -l
lrwxrwxrwx 1 hacker staff 3 8月 27 16:45 sample -> tmp
drwxrwxr-x 2 hacker staff 4096 8月 27 16:45 tmp
$ ls sample
memo.txt
マニュアル
コマンドの仕様(主な処理やオプション・引数など)は環境により異なる場合がございます。
利用環境での仕様は『コマンドのマニュアルを表示する』manコマンド等で確認しましょう。