Как перезаписать символическую ссылку каталога?

9149
ironsand

Есть две директории foo1и foo2.

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

Но barвсе еще связано с foo1. Симлинк 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 (без версии)
13

1 ответ на вопрос

15
Drew Chapin

Правильный способ сделать это состоит в том, чтобы использовать --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`? ironsand 10 лет назад 0
Я пробовал это на виртуальной машине Fedora 18 с версией 8.17. Интересно, что я попробовал это на своем настольном компьютере с Linux версии 8.21 и получил те же результаты, что и вы. Похоже, где-то между этими двумя версиями что-то изменилось. Решение, которое я разместил, сработало в обоих случаях. Drew Chapin 10 лет назад 0
К вашему сведению, я нашел этот ответ на форумах [justlinux.com] (http://forums.justlinux.com/showthread.php?117847-why-doesn-t-ln-sf-work). Drew Chapin 10 лет назад 0
Спасибо druciferre! Я даже не думал, что команда `ln` так часто обновляется. ironsand 10 лет назад 0
Я также тестировал в OSX. `ln` работает так же, как ubuntu и centos, с перезаписью каталога, а` ln -snf` решает проблему. Хотя `ln -h` является предпочтительным вариантом для использования в osx. ironsand 10 лет назад 0
@ Тецу, я также подтвердил это на FreeBSD. Drew Chapin 10 лет назад 0
Отлично, это даже работает с busybox; большое спасибо! lpapp 9 лет назад 0