Правильний спосіб зробити це - використовувати такий -n, --no-dereferenceваріант.
$ ln -snf foo2 bar
Це призводить lnдо трактування існуючого символьного посилання як до файлу. В іншому випадку, він разименовивает barдо foo1, нісхожу в foo1і використовує оригінальне TARGETім'я, що LINK_NAMEі саме тому ви в кінцевому підсумку з лінком для foo2створюваних всередині foo1каталогу. На сторінці lnвказується наступне ...
-n, --no -rereference
трактувати 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?