14

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

1 ответ1

16

Правильный способ сделать это - использовать опцию -n, --no-dereference следующим образом.

$ ln -snf foo2 bar

Это заставляет ln рассматривать существующую символическую ссылку как файл. В противном случае он разыменовывает bar с foo1 , спускается в foo1 и использует исходное имя TARGET в качестве LINK_NAME и поэтому в итоге вы получаете символическую ссылку на foo2 , создаваемую в foo1 . В справочной странице по ln говорится следующее ...

-n, --no-dereference
       treat  LINK_NAME  as a normal file if it is a symbolic link to a
       directory

Ниже приведен вывод оболочки на моем рабочем столе 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .