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


15

Есть две директории 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 (без версии)

Ответы:


18

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

Я пробовал это на виртуальной машине Fedora 18 с версией 8.17. Интересно, что я попробовал это на своем настольном компьютере с Linux версии 8.21 и получил те же результаты, что и вы. Похоже, где-то между этими двумя версиями что-то изменилось. Решение, которое я разместил, сработало в обоих случаях.
Дрю Чапин

К вашему сведению, я нашел этот ответ на форумах justlinux.com .
Дрю Чапин

Спасибо druciferre! Я даже не думал, что lnкоманда так часто обновляется.
утюги и

Я также тестировал в OSX. lnработает так же, как Ubuntu и Centos с каталогом перезаписать и ln -snfрешить проблему. Хотя ln -hэто предпочтительный вариант для использования в OSX.
утюги и
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.