参照:
https://superuser.com/questions/645842/how-to-overwrite-a-symbolic-link-of-a-directory
参照された記事はそれを非常に明確にしました、私は元の投稿の例を引用して少し追加します
これを行う適切な方法は、その-n, --no-dereference
ようなオプションを使用する ことです。
$ ln -snf foo2 bar
これにより ln
、既存のシンボリックリンクをファイルとして扱います。それ以外の場合は、を逆参照bar
し foo1
、foo1
元のTARGET
名前を に逆参照 し て使用し LINK_NAME
ます 。foo2
そのため、foo1
ディレクトリ内に作成されるシンボリックリンク が作成され ます。のマンページln
は次のように 述べています...
-n、--no-dereference LINK_NAMEが ディレクトリへのシンボリックリンクである場合、それを通常のファイルとして扱います
以下は、バージョン8.21のln
、--no-dereference
オプションあり、オプションなしの Arch Linuxデスクトップのシェル出力 です。--no-dereference
オプションなしで行ったのと同じ結果が得られました が、--no-dereference
オプションを使用する と、期待どおりに機能しました。
$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
total 0
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
簡単に言えば、-nは、既存のシンボリックリンク(つまり、ソフトリンク)がエスケープおよび解析されないようにすることです。これは、割り当てられた値を取る代わりに、$ varをそのまま出力することと同じです。
man lnはリンクを作成する4つの方法を示しています
名前
ln-ファイル間のリンクを作成する
あらすじ
ln [OPTION] ... [-T] TARGET LINK_NAME(1番目のフォーム)
ln [オプション] ... TARGET(2番目の形式)
ln [オプション] ...ターゲット...ディレクトリ(3番目の形式)
ln [オプション] ... -t DIRECTORY TARGET ...(4番目の形式)
説明
最初のフォームで、LINK_NAMEという名前でTARGETへのリンクを作成します。2番目に
現在のディレクトリにTARGETへのリンクを作成します。3番目と4番目の形式では、
ディレクトリ内の各ターゲットへのリンクを作成します。デフォルトでシンボリックなハードリンクを作成する
--symbolicでリンクします。デフォルトでは、各宛先(新しいリンクの名前)は
すでに存在しています。ハードリンクを作成するときは、各ターゲットが存在している必要があります。シンボリックリンク
任意のテキストを保持できます。後で解決された場合、相対リンクは
親ディレクトリとの関係。
長いオプションへの必須の引数は、短いオプションでも必須です。
上書きされたソフトリンクが-nパラメータなしでディレクトリを指している場合、これは2番目の作成方法と同等で、ディレクトリにソフトリンクファイルを作成します。