サイトアイコン スグブログ

【Linux】lnコマンドでシンボリックリンクの作成方法

script

Linuxでシンボリックリンクの作成方法がわかりにくいといった事はないでしょうか?

またシンボリックリンクとハードリンクの違いなどもわかりずらくないでしょうか?

そこでLinuxのシンボリックリンクについて、現役エンジニアの筆者がまとめます。

筆者はWindowsサーバーやLinuxサーバーの運用構築を11年間以上おこなってきました。その経験を元に知識を公開していきます!

Linuxでのわかりずらいリンクについて、実例を用いて説明していますので、理解する事が可能です。

Linuxでlnコマンドによるシンボリックリンクの作成方法

Linuxでシンボリックリンクの作成方法lnコマンドです。

ln -s リンク元のファイルかディレクトリ(絶対パス) シンボリックリンク

※リンク元のファイルを指定する時は絶対パスが必要です。

シンボリックリンクの確認は「ls -l」や「ls -F」で行います。

「ls -l」コマンドでは「シンボリックリンク -> リンク元のファイル」と表示されます。またパーミッションの最初に「l」がつきます。

「ls -F」コマンドでシンボリックリンクは名前の後にアットマークが付きます。これがシンボリックリンクの意味になります。

Linuxのlsコマンドのオプションについては、以下の記事でくわしくまとめています。

シンボリックリンクを様々なパターンで作成してみる

シンボリックリンクを作成する4パターンを見てみます。

シンボリックリンクを作成する4パターン
  • リンク元ファイルとシンボリックリンクのパスを指定する
  • リンク元ファイルとシンボリックリンクのパス+リンク名を指定する
  • リンク元ディレクトリとシンボリックリンクのパスを指定する
  • リンク元ディレクトリとシンボリックリンクのパス+ファイル名を指定する

リンク元ファイルとシンボリックリンクのパスを指定する

カレントディレクトリに「symbolic-link-file1」と「symbolic-link」ディレクトリを作成します。

mkdir symbolic-link
touch symbolic-link-file1

作成したファイルにviエディタで文字を記述します。

ファイル元の「symbolic-link-file1」のシンボリックリンクを「symbolic-link」ディレクトリに作成します。

リンク元ファイルとシンボリックリンクのパスを指定します。

ln -s /root/symbolic-link-file1 symbolic-link/

シンボリックリンクを「ls -l」コマンドで確認します。

[root@localhost ~]# ls -l symbolic-link/
合計 0
lrwxrwxrwx 1 root root 25  5月  8 18:10 symbolic-link-file1 -> /root/symbolic-link-file1

指定したパスの配下に元ファイルと同じ名前で、シンボリックリンクが作成されています。

catコマンドで元ファイルとシンボリックリンクの中身を確認します。

[root@localhost ~]# cat symbolic-link-file1
symbolic-link-file1-contents
[root@localhost ~]#
[root@localhost ~]# cat symbolic-link/symbolic-link-file1
symbolic-link-file1-contents

どちらも同じ内容が表示されています。シンボリックリンク作成成功です。

リンク元ファイルとシンボリックリンクのパス+リンク名を指定する

リンク元ファイルとシンボリックリンクのパス+リンク名を指定してみます。

ln -s /root/symbolic-link-file2 symbolic-link/link2

シンボリックリンクを「ls -l」コマンドで確認します。

[root@localhost ~]# ls -l symbolic-link/
合計 0
lrwxrwxrwx 1 root root 25  5月  8 18:33 link2 -> /root/symbolic-link-file2

指定したパスの配下に指定したファイル名で、シンボリックリンクが作成されています。

catコマンドで元ファイルとシンボリックリンクの中身を確認します。

[root@localhost ~]# cat symbolic-link-file2
symbolic-link-file2-contents
[root@localhost ~]#
[root@localhost ~]# cat symbolic-link/link2
symbolic-link-file2-contents

どちらも同じ内容が表示されています。シンボリックリンク作成成功です。

リンク元ディレクトリとシンボリックリンクのパスを指定する

ディレクトリ用のシンボリックリンクを置くディレクトリを作成します。

mkdir symbolic-link-dir

リンク元ディレクトリシンボリックリンクのパスを指定してみます。

ln -s /root/symbolic-link symbolic-link-dir/

シンボリックリンクを「ls -l」コマンドで確認します。

[root@localhost ~]# ls -l symbolic-link-dir/
合計 0
lrwxrwxrwx 1 root root 19  5月  8 18:45 symbolic-link -> /root/symbolic-link

指定したパスの配下に元ディレクトリ名で、シンボリックリンクが作成されています。

cdコマンドでシンボリックリンクを指定して移動してみます。

[root@localhost ~]# cd symbolic-link-dir/symbolic-link/

[root@localhost symbolic-link]# pwd
/root/symbolic-link-dir/symbolic-link

[root@localhost symbolic-link]# ls
link2 symbolic-link-file1

pwdコマンドでカレントディレクトリを表示すると、シンボリックリンクのパスが表示されていますが、lsコマンドをたたくと、元のディレクトリ「symbolic-link」の内容が表示されています。シンボリックリンク作成成功です。

リンク元ディレクトリとシンボリックリンクのパス+ファイル名を指定する

リンク元ディレクトリシンボリックリンクのパスを指定してみます。

ln -s /root/symbolic-link symbolic-link-dir/symbolic-link-dir-link

シンボリックリンクを「ls -l」コマンドで確認します。

[root@localhost symbolic-link-dir]# ls -l
合計 0
lrwxrwxrwx 1 root root 19  5月  8 18:54 symbolic-link-dir-link -> /root/symbolic-link

指定したパスの配下に指定したファイル名で、シンボリックリンクが作成されています。

cdコマンドでシンボリックリンクを指定して移動してみます。

[root@localhost symbolic-link-dir]# cd symbolic-link-dir-link/

[root@localhost symbolic-link-dir-link]# pwd
/root/symbolic-link-dir/symbolic-link-dir-link

[root@localhost symbolic-link-dir-link]# ls
link2 symbolic-link-file1

lsコマンドをたたくと、元のディレクトリ「symbolic-link」の内容が表示されています。シンボリックリンク作成成功です。

シンボリックリンクを削除する方法

シンボリックリンクを削除する方法は以下のコマンドです。

unlink シンボリックリンク

実際に削除してみます。

[root@localhost symbolic-link-dir]# ls -F
symbolic-link@  symbolic-link-dir-link@

[root@localhost symbolic-link-dir]# unlink symbolic-link
[root@localhost symbolic-link-dir]# ls
symbolic-link-dir-link

2つあったシンボリックリンクの一つが削除されています。

注意点としてシンボリックリンクを指定する時に、最後の/があれば削除できません。

[root@localhost symbolic-link-dir]# unlink symbolic-link-dir-link/
unlink: `symbolic-link-dir-link/' を削除 (unlink) できません: ディレクトリではありません

[root@localhost symbolic-link-dir]# unlink symbolic-link-dir-link
[root@localhost symbolic-link-dir]# ls
[root@localhost symbolic-link-dir]#

シンボリックリンクの最後の/があれば削除できません。/をなくしたら削除できています。

Linuxのリンクの種類について

Linuxでリンクの種類は2種類あります。

Linuxのリンクの2種類
  • シンボリックリンク
  • ハードリンク

それぞれの特徴をまとめます。

シンボリックリンクの特徴

シンボリックリンクの特徴類
  • ディレクトリにもリンク可能
  • 参照先のファイルを削除するとエラーとなる
  • i-nodeが参照元とシンボリックリンクで違うので、パーミッション間のリンクも可能
  • パーミッションの初めに「l」がつく

ハードリンクの特徴

シンボリックリンクの特徴類
  • ディレクトリにはリンク不可能
  • 同じi-nodeなので片方を削除してもエラーとはならない
  • i-nodeが参照元とシンボリックリンクが同じなので、パーミッション間のリンクは不可能

シンボリックリンクの作成は「ln」コマンドのsオプションでしたが、オプションなしだとハードリンクを作成できます。

シンボリックリンクとハードリンクの違いを確認する

シンボリックリンクとハードリンクを作成します。

ln -s symbolic-link-file3 symbolic-link-file3.ln
ln  symbolic-link-file4 symbolic-link-file4.ln

「ls -il」コマンドで確認します。

lsコマンドのiオプションで、ファイルやディレクトリのi-node番号を表示する事が可能です。

[root@localhost ~]# ls -il
合計 80
10797427 -rw-r--r--   1 root root    29  5月  8 20:20 symbolic-link-file3
10797421 lrwxrwxrwx   1 root root    19  5月  8 20:21 symbolic-link-file3.ln -> symbolic-link-file3

10797426 -rw-r--r--   2 root root    29  5月  8 20:21 symbolic-link-file4
10797426 -rw-r--r--   2 root root    29  5月  8 20:21 symbolic-link-file4.ln

シンボリックリンクパーミッションの初めにlがついていますが、ハードリンクにはついていません。

シンボリックリンク元ファイルはi-node番号が違いますが、ハードリンクは同じです。

シンボリックリンクの元ファイルを削除してみます。

rm -f symbolic-link-file3

シンボリックリンクをcatコマンドで参照してみます。

[root@localhost ~]# cat symbolic-link-file3.ln
cat: symbolic-link-file3.ln: そのようなファイルやディレクトリはありません

参照しようとしてもエラーで見る事ができません。

ハードリンク元を削除してみます。

[root@localhost ~]# rm -f symbolic-link-file4

ハードリンクを参照してみます。

[root@localhost ~]# cat symbolic-link-file4.ln
symbolic-link-file4-contents

参照元が削除されてもi-nodeが同じなので、ファイルの中身が表示されています。

シンボリックリンクの方は赤くなりエラーになっています。ハードリンクエラーが出ていません。

まとめ:Linuxでlnコマンドによるシンボリックリンクの作成方法

Linuxのlnコマンドによるシンボリックリンクの作成方法は以下のコマンドです。

ln -s リンク元のファイルかディレクトリ(絶対パス) シンボリックリンク

※リンク元のファイルを指定する時は絶対パスが必要です。

シンボリックリンクの確認は「ls -l」や「ls -F」で行います。

シンボリックリンクはパスを指定すれば、そのパス配下に元ファイル名でリンクが作成される。パス+ファイル名を指定する事でリンク名を付ける事ができる。

リンクの削除コマンドはunlinkコマンド

unlink リンク名

Linuxでリンクの種類は2種類あります。

Linuxのリンクの2種類
  • シンボリックリンク
  • ハードリンク

シンボリックリンクの特徴

シンボリックリンクの特徴類
  • ディレクトリにもリンク可能
  • 参照先のファイルを削除するとエラーとなる
  • i-nodeが参照元とシンボリックリンクで違うので、パーミッション間のリンクも可能
  • パーミッションの初めに「l」がつく

ハードリンクの特徴

シンボリックリンクの特徴類
  • ディレクトリにはリンク不可能
  • 同じi-nodeなので片方を削除してもエラーとはならない
  • i-nodeが参照元とシンボリックリンクが同じなので、パーミッション間のリンクは不可能

シンボリックリンクの作成「ln」コマンドのsオプションでしたが、オプションなしだとハードリンクを作成できます。

モバイルバージョンを終了