Итак, я создал символическую ссылку:
ln -s /location/to/link linkname
Теперь я хочу изменить местоположение, на которое ссылаются ссылки symlink. Как мне это сделать? есть ли способ сделать это, не удалив его сначала?
Итак, я создал символическую ссылку:
ln -s /location/to/link linkname
Теперь я хочу изменить местоположение, на которое ссылаются ссылки symlink. Как мне это сделать? есть ли способ сделать это, не удалив его сначала?
Вы можете создать новую ссылку с другим именем, а затем переместить ее, чтобы заменить старую ссылку.
ln -s /location/to/link linkname
Далее
ln -s /location/to/link2 newlink
mv newlink linkname
Если newlink
и linkname
находятся на одном физическом устройстве, mv
должен быть атомарным.
Попробуйте ln -sf new_destination linkname
.
Если целью symlink являются каталоги, вам нужно добавить флаг -T
в команду mv
, иначе он перемещает новую символическую ссылку в целевой каталог старой символической ссылки.
Пример атомарного переключения веб-сайта на новую версию:
Исходная настройка - веб-сайт хранится в каталоге www1
, vhost указывает на www
символическую ссылку:
ln -s www1 www
Перейдите на веб-сайт, см. старую версию.
Поместите новые файлы сайта в новый каталог www2
.
Настройте новую символическую ссылку на новый веб-сайт:
ln -s www_new www2
Переместить www
символическую ссылку в каталог нового веб-сайта:
mv -T www_new www
Перейдите на веб-сайт, немедленно ознакомьтесь с новой версией.
Для каталогов, которые вы хотите сделать: ln -sfT/location/to/new/target old_linkname
В OSX, страница man для ln говорит, что вы можете сделать это, как это
ln -shf /location/to/link link name
На странице man:
The options are as follows:
-F If the target file already exists and is a directory, then remove it so that the link may occur. The -F
option should be used with either -f or -i options. If none is specified, -f is implied. The -F option is
a no-op unless -s option is specified.
-h If the target_file or target_dir is a symbolic link, do not follow it. This is most useful with the -f
option, to replace a symlink which may point to a directory.
-f If the target file already exists, then unlink it so that the link may occur. (The -f option overrides any
previous -i options.)
-i Cause ln to write a prompt to standard error if the target file exists. If the response from the standard
input begins with the character `y' or `Y', then unlink the target file so that the link may occur. Other-
wise, do not attempt the link. (The -i option overrides any previous -f options.)
-n Same as -h, for compatibility with other ln implementations.
-s Create a symbolic link.
-v Cause ln to be verbose, showing files as they are processed.
Просто измените цель символической ссылки:
# ln -sfT /path/to/new/target linkname
Это мгновенное атомное изменение.
Нет. Системный вызов symlink
возвращает EEXIST
, если новый путь уже существует. Вы можете ссылаться только на новый node в файловой системе. Какое требование здесь? Если вас беспокоит гонка из-за неатомобильности вызовов unlink/symlink, вы можете немного переосмыслить архитектуру, чтобы обеспечить синхронизацию в другом месте. Там были некоторые страшные ошибки безопасности, введенные в этом виде.
Настройте команды следующим образом:
rm currentlink && ln -s /path/to/link currentlink
Первая команда удаляет существующую, а вторая сразу создает ее снова.
Как уже упоминалось, вы в основном должны сначала удалить символическую ссылку, либо вручную, либо передав флаг -f
утилите ln
.
Несколько лет назад мне приходилось делать небольшие изменения для символических ссылок довольно часто, поэтому я написал простую утилиту на основе readline (edln
), чтобы сделать это менее раздражающим. В случае, если кто-либо найдет это полезным, я разместил его в Интернете https://github.com/jjlin/edln/.
edln
отобразит исходную цель символической ссылки; вы можете использовать клавиши со стрелками или стандартные нажатия клавиш (M-b
, M-f
, C-d
и т.д.) для перемещения и редактирования цели.
Просто погуглил, не нашел хорошего ответа и решил самому решить:
ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary
Редактирование по определению означает не воссоздание с нуля, а изменение частично. Любой ответ, требующий запоминания пути, может быть, длинного или со странными символами, определенно плох.