シンボリックリンクを作成するコマンド
シンボリックリンクは、コマンド「ln -s」で作成できます。
# シンボリックリンク「symbolic-link」を作成する
$ ln -s <リンク先> <作成するシンボリックリンクの名前>
引数の順番が紛らわしいですが、下記となります。
- 第1引数:リンク先(=実体ディレクトリ、またはファイル)
- 第2引数:新しく作成されるシンボリックリンクの名前
それでは、実行して、動作を確認してみましょう。
# 実行!
$ ln -s target-dir symbolic-link
# lsコマンドで、作成されたシンボリックリンクを確認
$ ls -la
# シンボリックリンクができている!
drwxr-xr-x 3 joe wheel 96 .
drwxr-xr-x 4 joe wheel 128 ..
-rwxr-xr-x 1 joe wheel 266 target-dir
lrwxr-xr-x 1 joe wheel 10 symbolic-link -> target-dir
第1引数の「リンク先」は、ディレクトリ名でもファイル名でも構いません。
そうじゃな。わしもたまに忘れるぞ。少し引数について、深堀りしてみるのじゃ
第1引数「リンク先」とは?
第1引数の「リンク先」は、新しく作成されるシンボリックリンクの場所からの「相対パス」の指定となる点に、注意が必要です。(もちろん、フルパスを指定すれば絶対パスとなります)
よくある失敗例が、現在のディレクトリの外に新しくシンボリックリンクを配置しようとうする場合です。
# ディレクトリ「my-links」を作って・・・
$ mkdir my-links
$ mkdir target
# ディレクトリ内にシンボリックリンクを作成
$ ln -s target my-links/new-sym-link
# 確認すると、同じディレクトリ内で、target を参照しようとしている
$ ls -la my-links
drwxr-xr-x 3 joe wheel 96 .
drwxr-xr-x 4 joe wheel 128 ..
lrwxr-xr-x 1 joe wheel 10 new-sym-link -> target
シンボリックリンクからの相対パスか、もしくは、絶対パスで指定する必要があります。
# やり直し。
$ mkdir my-links
$ mkdir target
# ディレクトリ内に、シンボリックリンクを作成
# 相対パスで、親階層を指定
$ ln -s ../target my-links/target-link
# 確認。今度はうまく行っている。
$ ls -la my-links
drwxr-xr-x 3 joe wheel 96 .
drwxr-xr-x 4 joe wheel 128 ..
lrwxr-xr-x 1 joe wheel 10 target-link -> ../target
上記は、相対パスを利用していますが、シンボリックリンク自体があとで移動される可能性がある場合などは、絶対パスを使うほうが適切なケースもあります。
第二引数「シンボリックリンク名」
前述の通り、第二引数に「シンボリックリンク名」を指定しますが、第二引数に「既存のディレクトリ名」が渡された場合、この命名をスキップすることもできます。この場合、第一引数で指定した「リンク先(実体)」の名前が、そのままシンボリックリンク名として使われます。
同じ仕様で、もし第二引数を引数を全く指定しなければ、「.」 、すなわち現在のディレクトリが暗黙的に第二引数に指定されますので、結果として現在のディレクトリに、新しいシンボリックリンクが、リンク先と同じファイル名(もしくは、ディレクトリ名で)で作成されます。
[あるある失敗] 第二引数の仕様に注意!
まれに発生する誤りの一つが、第二引数で「シンボリックリンク名」を命名したつもりが、それが意図せず「既存のディレクトリ名」と一致してしまい、この振る舞いで実行されてしまうケースです:
# 準備:ディレクトリ
$ mkdir target
$ mkdir target-alt
# target へリンクを作りたかったが、第2引数が既存ディレクトリ名「target-alt」とマッチしている
# 下記は、このコマンドと同じ意味になる
# $ ln -s target ./target-alt/target
$ ln -s target target-alt
# 結果として、シンボリックリンクはこのディレクトリではなく、
$ ls -la
drwxr-xr-x 4 joe wheel 128B .
drwxr-xr-x@ 30 joe wheel 960B ..
drw-r--r-- 1 joe wheel 10B target
drw-r--r-- 1 joe wheel 10B target-alt
# target ディレクトリ内に、リンク target が作成されている。
$ ls -la ./target-alt
drwxr-xr-x 4 joe wheel 128B .
drwxr-xr-x@ 30 joe wheel 960B ..
drw-r--r-- 1 joe wheel 10B target -> target
この失敗はかなり発生しやすいのじゃ。「リンク先」が現在のディレクトリにある場合は、実行前に、要注意なのじゃ!
複数のリンク先
これはあまり利用する機会がないかもしれません。
ln コマンドは、実際は「リンク先」の指定を複数まとめて引き受ける指定が可能です。
# 例1
# 複数のパス指定をまとめて引き受ける
$ ln -s target-1.txt target-3.txt target-3.txt slinks
# 例2
# ワイルドカードでまとめてリンクを作成
$ ln -s target-*.txt slinks
シンボリックリンクの削除
作成したシンボリックリンクは「unlink」コマンドで削除できます。
$ unlink sym-link
rm -r の削除コマンドも有効ですが、誤ってリンク先の実体を削除してしまうことがありますので、仕様は避けたほうが良いでしょう。
# これはOK。対象のシンボリックリンクを削除する
$ rm -r sym-link
# ディレクトリ末尾にスラッシュがつくと、意味が変わる
# これは悲劇。リンク先のディレクリ内の実体ファイルを削除する
$ rm -r sym-link/
人間は、わかっていてもいつか間違ってしまう生き物じゃからな。rm は使わないほうがよいのじゃ
これで基本的な使い方は、OKじゃな!
明日にも、忘れそうだよ〜
引数の順番が、いつも混乱しちゃうんだよね・・