Правильний спосіб зробити це - використовувати такий -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
?