Як перезаписати символічне посилання каталогу?


15

Є два каталоги foo1та foo2.

Спочатку я роблю каталог symlink by ln -s foo1 bar. Після цього я хочу змінити симпосилання, тому я набравln -sf foo2 bar

Але barвсе ще пов'язаний з foo1. Symlink foo2створено всередині foo1.

На що слід ввести, коли я хочу замінити foo1його foo2?

Я тестував у трьох середовищах.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (без версії)

Відповіді:


18

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

Я спробував це на Fedora 18 VM з версією 8.17. Цікаво, що я спробував це на своєму робочому столі Arch Linux з версією 8.21 і отримав ті самі результати, що і ви. Схоже, десь між цими двома версіями щось змінилося. Однак рішення, яке я розмістив, працювало в обох випадках.
Дрю Шапін

FYI, я знайшов цю відповідь на форумах justlinux.com .
Дрю Шапін

Спасибі druciferre! Я навіть ніколи не думав, що lnкоманду так часто оновлюють.
ironsand

Я також тестував в osx. lnпрацює так само, як ubuntu та centos з каталогом перезаписує та ln -snfвирішує проблему. Незважаючи на те ln -h, що кращий варіант використовувати в OSX.
ironsand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.