ln -sf の動作
概要
ln -sの第2引数がフォルダだと、フォルダ内にリンクを作りに行く- フォルダへのシンボリックリンクだとしても、この動作
ln -sfでは「存在する場合に上書き」となるが- これは第2引数がフォルダへのシンボリックリンクだった場合、上書き対象と認識されない
という都合で、ln -sf でフォルダへのシンボリックリンクを作ろうとすると、
サブフォルダにリンクが作られてしまう。
- フォルダへのシンボリックリンクでも上書きしたい場合は
- 回避1:
ln -snfのように-nをつける ( 環境によって-Tまたは-hかも ) - 回避2: 削除してからリンクしなおす
- 回避1:
以下は試したこと
フォルダへのシンボリックリンクの動作
当初混乱した動作
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
以下広告