Как перезаписать символическую ссылку каталога?
Есть две директории foo1 а также foo2,
Сначала я делаю символическую ссылку на каталог ln -s foo1 bar, После этого я хочу изменить символическую ссылку, поэтому я набрал ln -sf foo2 bar
Но bar все еще связан с foo1, Symlink foo2 создается внутри foo1,
Что я должен набрать, когда я хочу заменить foo1 от foo2?
Я тестировал в трех средах.
- Ubuntu 12.04, ln (GNU coreutils) 8.13
- CentOS 6.4, ln (GNU coreutils) 8.4
- 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