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

Есть две директории foo1 а также foo2,

Сначала я делаю символическую ссылку на каталог 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 (без версии)

1 ответ

Решение

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

$ ln -snf foo2 bar

Это вызывает ln рассматривать существующую символическую ссылку как файл. В противном случае, это разыменовывает bar в foo1, спускается в foo1 и использует оригинал TARGET имя как LINK_NAME и вот почему вы в конечном итоге с символической ссылкой на foo2 создается внутри foo1 каталог. Manpage на 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
Другие вопросы по тегам