はむはむエンジニアぶろぐ

プログラミングやファイナンスや健康や目標設定などを中心にブログを書いてます

ハードリンクとシンボリックリンクの違い - UNIX

UNIXにはlnコマンドでリンクを作成できるが、リンクには2種類存在する。

  • シンボリックリンク
  • ハードリンク

これら2つには違いがあるので確認をする。

シンボリック

シンボリックリンクの作成

-sオプションを付けすことで、シンボリックリンクを作成できる。
copied_text.txtがシンボリックリンクである。

$ ln -s text.txt copied_text.txt


シンボリックリンクの住所確認

シンボリックリンクは、元のファイルのパスを格納しているだけである。
その為、実体は別である。

lsに-iオプションを付けることでinode number(iノード番号)を確認できる。
iノード番号は、ファイルの住所です。

$ ls -il
total 8
8594721563 lrwxr-xr-x  1 hamuhamu  staff  8  1 20 23:41 copied_text.txt -> text.txt
8594721524 -rw-r--r--@ 1 hamuhamu  staff  4  1 20 23:43 text.txt

8594721563と8594721524がiノード番号です。
iノード番号が違うということは、ファイルの実態は別ということになる。

シンボリックリンクのファイルサイズ確認

実体が別のため、ファイルのサイズも違います。

$ ls -lh
total 8
lrwxr-xr-x  1 hamuhamu  staff     8B  1 21 13:49 copied_text.txt -> text.txt
-rw-r--r--  1 hamuhamu  staff   937B  1 21 13:49 text.txt

元のファイルが937Bに対して、シンボリックリンクが8Bになっています。

ハードリンク

ハードリンクの作成

ハードリンクはオプション無しで作成します。

$ ln text.txt copied_text.txt


ハードリンクの住所確認

ハードリンクは、異なるファイル名で同じ実体を指す機能です。
その為、iノード番号は同じになる。

$ ls -li
total 16
8594721524 -rw-r--r--@ 2 hamuhamu  staff  5  1 21 00:04 copied_text.txt
8594721524 -rw-r--r--@ 2 hamuhamu  staff  5  1 21 00:04 text.txt

元のファイルとハードリンクが8594721524と8594721524で一致しているのを確認できる。

ハードリンクのファイルサイズ確認

実体は同じ物を指しているため、ファイルサイズも同じである。

$ ls -lh
total 16
-rw-r--r--  2 hamuhamu  staff   937B  1 21 13:49 copied_text.txt
-rw-r--r--  2 hamuhamu  staff   937B  1 21 13:49 text.txt


iノードのリンク数の確認

iノードのリンク数(元のファイルとハードリンクの数)を確認することができます。

$ ln text.txt copied_text_2.txt
$ ln text.txt copied_text_3.txt

$ ls -lh
total 32
-rw-r--r--  4 hamuhamu  staff   937B  1 21 13:49 copied_text.txt
-rw-r--r--  4 hamuhamu  staff   937B  1 21 13:49 copied_text_2.txt
-rw-r--r--  4 hamuhamu  staff   937B  1 21 13:49 copied_text_3.txt
-rw-r--r--  4 hamuhamu  staff   937B  1 21 13:49 text.txt

4というのが元のファイルとハードリンク数をあわせた数。
ハードリンクを増減することで、数値が増減する。


ハードリンクをを削除して確認してみる。

$ rm copied_text_2.txt
$ rm copied_text_3.txt

$ ls -lh
total 16
-rw-r--r--  2 hamuhamu  staff   937B  1 21 13:49 copied_text.txt
-rw-r--r--  2 hamuhamu  staff   937B  1 21 13:49 text.txt

リンク数が2になった。