kazmax - Linux で自宅サーバー

シンボリックリンクとは

Linuxには、ファイルに別名をつけ、異なった名前でファイルにアクセスする仕組みがあります。これをリンクと呼びます。

リンクは2種類あり、ハードリンクとシンボリックリンク(ソフトリンク)が存在します。

ここでは、シンボリックリンクについて説明します。

Last Update : 2014年02月02日

シンボリックリンクとは 項目

  1. シンボリックリンクとは
  2. シンボリックリンクの作成
  3. シンボリックリンクのコピー

シンボリックリンクとは

シンボリックリンクとは、Windowsでいうところのショートカットのようなもので、ファイルや、ディレクトリを参照するファイルの事をいいます。

シンボリックリンクファイル自体は、対象ファイルまでのパスを含んだただの小さなファイルです。

ですので、シンボリックリンクファイル自体を削除しても参照先のファイル・ディレクトリへの影響はありません。また、参照先のファイル・ディレクトリが削除されてもシンボリックリンクは残ります。ハードリンクは、ハードリンクを削除する事で実体ファイルを削除できますが、シンボリックリンクは、シンボリックリンクを通じての実体の削除はできません。

実際には存在しないファイルを指したシンボリックリンクを作成する事もできます。要は、ファイルや、ディレクトリを参照するファイルだけど、シンボリックリンクと、その参照先のファイル・ディレクトリは別物という事です。

また、ハードリンクと違い、NFSでマウントされているような異なるファイルシステム上のファイルに対しても作成できたり、ディレクトリに対してもリンクを作成する事ができる事が大きなメリットだと思います。

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

シンボリックリンクは、「ln 」コマンドを使って作成します。オプションに、シンボリックリンクをあらわす「-s」を指定します。

書式

ln -s 参照先ファイル(ディレクトリ)のパス [シンボリックリンクのファイル名]

※参照先ファイル、シンボリックリンクのファイル名部分は、フルパスでも相対パスでも指定可能です。
シンボリックリンクのファイル名は省略可能です。省略した場合は、参照先に指定した同じファイル名/ディレクトリ名でカレントディレクトリにシンボリックリンクが作成されます。

例)

参照されるファイル:/tmp/test.txt
作成するシンボリックリンクファイル:/tmp/symlink.txt

# pwd
/tmp

# ln -s /tmp/test.txt symlink.txt ←「-s」オプションでシンボリックリンクを作成する

# ls -l
lrwxrwxrwx. 1 root root   13 10月 29 01:01 2013 symlink.txt -> /tmp/test.txt ←シンボリックリンクが作成された
-rw-r--r--. 1 root root    0 10月 29 01:01 2013 test.txt

シンボリックリンク経由でファイルを更新してみます。

# cat test.txt ← 元のファイルの中身が空である事を確認

# echo ABC > symlink.txt ← 文字列「ABC」を追記

# cat symlink.txt ← シンボリックリンク経由でファイルの中身を確認
ABC

# cat test.txt ← 直接ファイルの中身を確認
ABC

シンボリックリンクのコピー

シンボリックリンク自体をコピーするする場合は、cp コマンドに「-d」オプションをつける必要があります。そのままcp コマンドでシンボリックリンクをコピーすると、参照先のファイルがコピーされてしまいます。

# ls -l
lrwxrwxrwx. 1 root root   13 10月 29 01:01 2013 symlink.txt -> /tmp/test.txt
-rw-r--r--. 1 root root    4 10月 29 01:05 2013 test.txt

# cp symlink.txt symlink.cp.txt ←オプションなしでシンボリックリンクをcp

# ls -l
-rw-r--r--. 1 root root    4 10月 29 02:52 2013 symlink.cp.txt ← リンク先のファイルがコピーされる
lrwxrwxrwx. 1 root root   13 10月 29 01:01 2013 symlink.txt -> /tmp/test.txt
-rw-r--r--. 1 root root    4 10月 29 01:05 2013 test.txt

普通にcpコマンドでシンボリックリンクをコピーすると、参照先のファイル本体がコピーされるので注意が必要です。シンボリックリンクをシンボリックリンクとしてコピーしたい場合は、cpコマンドのオプションに、「-d」を指定します。

# cp -d symlink.txt symlink.cp-d.txt ←「-d」オプションをつけてcpする

# ls -l
lrwxrwxrwx. 1 root root   13 10月 29 02:52 2013 symlink.cp-d.txt -> /tmp/test.txt ← シンボリックリンクとしてコピーされる
-rw-r--r--. 1 root root    4 10月 29 02:52 2013 symlink.cp.txt
lrwxrwxrwx. 1 root root   13 10月 29 01:01 2013 symlink.txt -> /tmp/test.txt
-rw-r--r--. 1 root root    4 10月 29 01:05 2013 test.txt

memo

ls -l での出力について

# ls -l
lrwxrwxrwx. 1 root root 13 10月 29 01:01 2013 symlink.txt -> /tmp/test.txt

コマンドの出力結果の先頭の「lrwxrwxrwx」の一文字目の「l」は、「このファイルはシンボリックリンクです」という意味です。

Linuxファイルシステム 関連記事
Linux 基礎知識 関連記事