Правильный способ сделать это - использовать эту -n, --no-dereferenceопцию следующим образом.
$ ln -snf foo2 bar
Это приводит lnк тому, что существующая символическая ссылка обрабатывается как файл. В противном случае, он разыменовывает barк foo1, нисхожу в foo1и использует оригинальное TARGETимя, что LINK_NAMEи именно поэтому вы в конечном итоге с линком для foo2создаваемых внутри foo1каталога. На странице lnруководства говорится следующее ...
-n, -no-разыменование
рассматривать LINK_NAME как обычный файл, если это символическая ссылка на
каталог
Ниже приведен вывод оболочки на моем рабочем столе Arch Linux с версией 8.21 lnс --no-dereferenceопцией и без нее , я получил те же результаты, что и вы, без --no-dereferenceопции, но с --no-dereferenceопцией она работала, как и ожидалось.
$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
total 0
lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
ln --version?