Как перезаписать символическую ссылку каталога?
Есть две директории 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