よく見ると、ln-sfはあなたが望むことをしているようです。
最初の列はiノード番号です。変更されないことに注意してください。
$ ln -s foo bar
$ ls -li bar
16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> foo
$ ln -sf buz bar
$ ls -li bar
16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> buz
ln-sfはこれを実現するために単にunlink()とsymlink()を使用しているようです。
$ strace ln -sf quux bar
<snip>
symlink("quux", "bar") = -1 EEXIST (File exists)
unlink("bar") = 0
symlink("quux", "bar") = 0
$ ls -li bar
16503 lrwxrwxrwx 1 golemon golemon 4 2010-08-21 12:31 bar -> quux