web-dev-qa-db-ja.com

シンボリックリンクターゲットを更新する方法(ln -f -sが機能しない)

私は使っています

ln -f -s/var/www/html/releases/build1390 app-current

シンボリックリンク「app-current」を新しい宛先で更新します。ただし、これは機能せず、「app-current」リンクは元の宛先を保持しますが、エラーは発生しません...

リンクを削除して再作成するのではなく、既存のリンクのターゲットを更新するだけです。それは可能ですか?

45
solsol

それは私にとってはうまくいきます、strace ln -f -s /var/www/html/releases/build1390 app-currentの出力は何ですか?

ああ、それはディレクトリなので、逆参照なしで-nを追加する必要があります。これで問題が解決します。 -fは、-fを追加するとリンクが解除されるだけなので、本当に便利です。私はそれがおそらく通常ロードされたシステムで数百ミリ秒速く起こると思いますが。

たとえば、arfがすでに/ homeを指している場合:

-n付きのstrace:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

-nなしのstrace:

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内に新しいシンボリックリンクを作成したので、それをクリーンアップしたいと思います。

56
Kyle Brandt

-nまたは--no-dereferenceを使用して、ターゲットがシンボリックリンクである場合に逆参照されないようにすることができます。 -Tまたは--no-target-directoryを使用して、ターゲットファイルがalwaysが通常のファイルとして扱われるようにすることもできます。

次の例に示すように、これらは少し異なる動作を生成します。 srcがファイルであり、dirlinkがディレクトリへのシンボリックリンクであり、dirが実際のディレクトリであるとします。

-nの使用:

  • ln -sfn src dirlinkdirlinkを上書きし、srcにリンクします
  • ln -sfn src dirはリンクを作成しますdir/src -> src

-Tの使用:

  • ln -sfT src dirlinkdirlinkを上書きし、srcにリンクします
  • ln -sfT src dirはエラーメッセージを生成します:ln: ‘dir’: cannot overwrite directory
13
augurar