私は使っています
ln -f -s/var/www/html/releases/build1390 app-current
シンボリックリンク「app-current」を新しい宛先で更新します。ただし、これは機能せず、「app-current」リンクは元の宛先を保持しますが、エラーは発生しません...
リンクを削除して再作成するのではなく、既存のリンクのターゲットを更新するだけです。それは可能ですか?
それは私にとってはうまくいきます、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
内に新しいシンボリックリンクを作成したので、それをクリーンアップしたいと思います。
-n
または--no-dereference
を使用して、ターゲットがシンボリックリンクである場合に逆参照されないようにすることができます。 -T
または--no-target-directory
を使用して、ターゲットファイルがalwaysが通常のファイルとして扱われるようにすることもできます。
次の例に示すように、これらは少し異なる動作を生成します。 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