私は使用しています
ln -f -s /var/www/html/releases/build1390 アプリ-現在
シンボリック リンク「app-current」を新しい宛先に更新します。ただし、これは機能しません。リンク「app-current」は元の宛先を保持しますが、エラーは発生しません...
リンクを削除して再作成するのではなく、既存のリンクのターゲットを更新するだけです。それは可能ですか?
答え1
それは私にとってはうまくいきます、 の出力は何ですかstrace ln -f -s /var/www/html/releases/build1390 app-current
?
ああ、これは参照解除しないように追加する必要があるディレクトリなので-n
、これで問題は解決するはずです。-f
-f を追加するととにかくリンクが解除されるだけなので、これは本当に便利です。ただし、通常の負荷のシステムでは、おそらく数百ミリ秒速く実行されると思います。
たとえば、arf がすでに /home を指している場合:
strace と-n
:
strace ln -n -f -s / arf
...
symlink("/", "arf") = -1 EEXIST (File exists)
unlink("arf") = 0
symlink("/", "arf") = 0
strace なし-n
:
strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: ) = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1) = 1
したがって、-n
arf がなければ逆参照されるため、ln はそれを arf として扱います。これは、実際に であるかのように扱われます/
。特定の例では、エラーがない場合は、おそらく 内に新しいシンボリック リンクが作成されているので/var/www/html/releases/build1390 app-current
、それをクリーンアップする必要があると思います。
答え2
-n
または--no-dereference
を使用すると、対象がシンボリックリンクである場合に、その参照が解除されるのを防ぐことができます。または-T
を使用する--no-target-directory
と、対象ファイルがいつも通常のファイルとして扱われます。
これらは、次の例に示すように、わずかに異なる動作を生成します。 がsrc
何らかのファイルであり、dirlink
がディレクトリへのシンボリックリンクであり、 がdir
実際のディレクトリであるとします。
使用方法-n
:
ln -sfn src dirlink
上書きしdirlink
てリンクするsrc
ln -sfn src dir
リンクを作成dir/src -> src
使用方法-T
:
ln -sfT src dirlink
上書きしdirlink
てリンクするsrc
ln -sfT src dir
エラーメッセージが生成されます:ln: ‘dir’: cannot overwrite directory