Правильный способ сделать это состоит в том, чтобы использовать --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