私の知る限り、できません。削除して再作成する必要があります。実際には、シンボリックリンクを上書きして、それによって参照されるパス名を更新できます。
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
編集:OPがコメントで指摘したように、この--force
オプションを使用するln
と、unlink()
before へのシステムコールが実行されますsymlink()
。以下は、strace
私のLinuxボックスの出力です。
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
最終的な答えは「いいえ」だと思います。
編集:以下は、2016年頃のunix.stackexchange.comのArto Bendikenの回答からコピーされたものです。
これは確かrename(2)
に、最初に一時的な名前で新しいシンボリックリンクを作成し、次に古いシンボリックリンクを一度に完全に上書きすることにより、アトミックに行うことができます。同様にmanページの状態:
newpathがシンボリックリンクを参照している場合、リンクは上書きされます。
シェルでは、これをmv -T
次のように実行します。
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
strace
その最後のコマンドrename(2)
で、実際に使用されていることを確認できます。
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
上記のmv -T
とstrace
はLinux固有のものであることに注意してください。
FreeBSDでは、mv -h
交互に使用します。
編集者注:これは、カピストラーノが〜2.15以降、何年にもわたって行ってきた方法です。このプルリクエストをご覧ください。
ln
コマンド(または同等のAPI)を発行して古いリンクを上書きしないのはなぜですか?どんな問題がありますか