シンボリックリンクの作成コマンド「ln -s」

最終更新:2021-12-19 by Joe

シンボリックリンクを作成するコマンド

シンボリックリンクは、コマンド「ln -s」で作成できます。

下記の例では、第1引数「target.txt」が参照先の指定、第2引数「simbolik-link」 が作成されるリンクの名前となります。

# シンボリックリンク「symbolic-link.txt」を作成する
$ ln -s target.txt symbolic-link.txt


# いちおう、確認
$ ls -la

# シンボリックリンクができている!
drwxr-xr-x  3 joe  wheel  96 .
drwxr-xr-x  4 joe  wheel 128 ..
-rwxr-xr-x  1 joe  wheel 266 target.txt
lrwxr-xr-x  1 joe  wheel  10 symbolic-link.txt -> target.txt

第1引数の「参照先」は、ディレクトリ名でもファイル名でも構いません。

引数の順番が、いつも混乱しちゃうんだよね・・

そうじゃな。わしもたまに忘れるぞ。少し引数について、深堀りしてみるのじゃ

引数の指定とコマンドの振る舞いについて

ln コマンドの第1引数「参照先」とは?

第1引数の「参照先」は、作成されるシンボリックリンクの場所からの「相対パス」の指定となる点に、注意が必要です。(もちろん、フルパスを指定すれば絶対パスとなります)

下記はよくある失敗例です。

# ディレクトリ「slinks」を作って・・・
$ mkdir slinks


# ディレクトリ内に、シンボリックリンクを作成!
$ ln -s target.txt slinks/target.txt


# 確認
$ ls -la slinks

# target.txt が事故参照(無限参照)になっている・・・。
drwxr-xr-x  3 joe  wheel   96  .
drwxr-xr-x  4 joe  wheel  128  ..
lrwxr-xr-x  1 joe  wheel   10  target.txt -> target.txt


# 開こうとするとエラーになる・・・。
$ less target.txt 
target.txt: Too many levels of symbolic links

シンボリックリンクからの相対パスか、絶対パスで指定する必要があります。

シンボリックリンク自体があとで移動される可能性がある場合は、絶対パスを使うほうが安全でしょう。

# やり直し。
# ディレクトリ「slinks」を作って・・・
$ mkdir slinks


# ディレクトリ内に、シンボリックリンクを作成!
# 相対パスで指定
$ ln -s ../target.txt slinks/rel.txt

# 絶対パスも試してみる
$ ln -s /var/www/html/target.txt slinks/abs.txt


# 確認
$ ls -la slinks


# うまく行っている!
drwxr-xr-x  3 joe  wheel   96  .
drwxr-xr-x  4 joe  wheel  128  ..
lrwxr-xr-x  1 joe  wheel   10 rel.txt -> ../target.txt
lrwxr-xr-x  1 joe  wheel   10 abs.txt -> /var/www/html/target.txt

第2引数に注意。ディレクトリ名とマッチする場合

この仕様は、たまに混乱を引き起こします。

ln コマンドは、実際は「参照先」の指定を複数、まとめて引き受ける指定が可能です。

ln 実行時の、最後の引数で指定した文字列が既存のディレクトリにマッチした場合に、この振る舞いになります。

# ディレクトリ「slinks」を作って・・・
$ mkdir slinks


# ディレクトリ内に、シンボリックリンクを作成!(最後の引数がディレクトリ名と一致)
$ ln -s target.txt slinks


# ディレクトリ内にシンボリックリンクができる。
# この場合、参照先と同じファイル名(ディレクトリ名)が自動で適応される。
$ ls -la slinks
drwxr-xr-x   4 joe  wheel   128B  .
drwxr-xr-x@ 30 joe  wheel   960B  ..
lrw-r--r--   1 joe  wheel    10B  target.txt -> target.txt



# 例1
# 複数のパス指定をまとめて引き受ける
$ ln -s target-1.txt target-3.txt target-3.txt slinks

# 例2
# ワイルドカードでまとめてリンクを作成
$ ln -s target-*.txt slinks

引数の指定にマッチするディレクトリが見つかれば、そのディレクトリ内に、第1引数の指定したファイル名(ディレクトリ名)で、シンボリックリンクが作成されます。

なるほど、この仕様はよくわかっていなかったよ〜

第2引数「シンボリックリンク名」の省略?

ちなみに、ln -s コマンドは、引数1つでも実行可能です。

第一引数のみで実行した場合、第2引数は、「.」すなわち、「現在のディレクトリ」という指定にフォールバックします。

この場合、前述の振る舞いが適応されますので、自動的に同じファイル名(ディレクトリ名)が使われます。


# 第1引数のみで、実行
$ ln -s /var/www/html


# ディレクトリ「.」に対して実行。
# 自動で、同じファイル名が使われる。
$ ls -la
drwxr-xr-x   4 joe  wheel   128B  .
drwxr-xr-x@ 30 joe  wheel   960B  ..
lrw-r--r--   1 joe  wheel    10B  html -> /var/www/html

これで基本的な使い方は、OKじゃな!

たぶんOK。ま、忘れたらまた調べるよ〜。