Skip to main content

ln -sf の動作

概要

  • ln -s の第2引数がフォルダだと、フォルダ内にリンクを作りに行く
    • フォルダへのシンボリックリンクだとしても、この動作
  • ln -sf では「存在する場合に上書き」となるが
    • これは第2引数がフォルダへのシンボリックリンクだった場合、上書き対象と認識されない

という都合で、ln -sf でフォルダへのシンボリックリンクを作ろうとすると、
サブフォルダにリンクが作られてしまう。

  • フォルダへのシンボリックリンクでも上書きしたい場合は
    • 回避1: ln -snf のように -n をつける ( 環境によって -T または -h かも )
    • 回避2: 削除してからリンクしなおす

以下は試したこと

フォルダへのシンボリックリンクの動作

当初混乱した動作

bash
mkdir aaa
mkdir bbb
ln -s $(realpath aaa) bbb/aaa-lnk
ln -sf $(realpath aaa) bbb/aaa-lnk

ls -l bbb/aaa-lnk
ls -l bbb/aaa-lnk/

aaa-lnk が上書きされるのかなと思いきや、
フォルダ内にリンクが作られる。

txt
bbb/aaa-lnk -> /path/to/aaa
aaa -> /path/to/aaa

man を見ると、「既にあったら削除して作り直す」と書いているように見えるが、
これはファイルへのシンボリックリンクの場合の動作か。

txt
-f   If the target file already exists, then unlink it so that the link may occur.

あるべきやりかた (1) : 引数に -n もつける

-n ( --no-dereference ) をつける。

bash
mkdir aaa
mkdir bbb
ln -s $(realpath aaa) bbb/aaa-lnk
ln -snf $(realpath aaa) bbb/aaa-lnk

ls -l bbb/aaa-lnk
ls -l bbb/aaa-lnk/
txt
bbb/aaa-lnk -> /path/to/aaa
total 0

あるべきやりかた (2) : 削除してから

フォルダへのシンボリックリンク作成時は -f は使わず、
「削除してから作成」とする。

bash
mkdir aaa
mkdir bbb
ln -s $(realpath aaa) bbb/aaa-lnk

rm -f bbb/aaa-lnk # シェルスクリプトなら初回用の対策として rm には -f つけるか
ln -s $(realpath aaa) bbb/aaa-lnk

ls -l bbb/aaa-lnk
ls -l bbb/aaa-lnk/
txt
bbb/aaa-lnk -> /path/to/aaa
total 0

ファイルへのシンボリックリンクの場合

txt
-f   If the target file already exists, then unlink it so that the link may occur.

ファイルへのシンボリックリンクだと、この通りの動作になる。

bash
touch aaa.txt
mkdir bbb
ln -s $(realpath aaa.txt) bbb/aaa-lnk
ln -sf $(realpath aaa.txt) bbb/aaa-lnk

ls -l bbb/aaa-lnk
txt
aaa-lnk -> /path/to/aaa.txt

以下広告