【コマンドライン】ハードリンクとシンボリックリンクの作成 [ ln ]

【コマンドライン】ハードリンクとシンボリックリンクの作成 [ 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.txtmemo.txt386043であるため、同じデータへのハードリンクであることが分かります。

また、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.txthl-sample.txtは同じデータを示すハードリンクです。

そのため、memo.txtを削除しても、hl-sample.txtが存在するため、データは残ります。

しかし、sl-sample.txtmemo.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コマンド等で確認しましょう。