Подтвердить что ты не робот

Есть ли способ редактировать символическую ссылку, не удаляя ее сначала?

Итак, я создал символическую ссылку:

ln -s /location/to/link linkname

Теперь я хочу изменить местоположение, на которое ссылаются ссылки symlink. Как мне это сделать? есть ли способ сделать это, не удалив его сначала?

4b9b3361

Ответ 1

Вы можете создать новую ссылку с другим именем, а затем переместить ее, чтобы заменить старую ссылку.

ln -s /location/to/link linkname

Далее

ln -s /location/to/link2 newlink
mv newlink linkname

Если newlink и linkname находятся на одном физическом устройстве, mv должен быть атомарным.

Ответ 2

Попробуйте ln -sf new_destination linkname.

Ответ 3

Если целью symlink являются каталоги, вам нужно добавить флаг -T в команду mv, иначе он перемещает новую символическую ссылку в целевой каталог старой символической ссылки.

Пример атомарного переключения веб-сайта на новую версию:

Исходная настройка - веб-сайт хранится в каталоге www1, vhost указывает на www символическую ссылку:

ln -s www1 www

Перейдите на веб-сайт, см. старую версию.

Поместите новые файлы сайта в новый каталог www2.

Настройте новую символическую ссылку на новый веб-сайт:

ln -s www_new www2

Переместить www символическую ссылку в каталог нового веб-сайта:

mv -T www_new www

Перейдите на веб-сайт, немедленно ознакомьтесь с новой версией.

Ответ 4

Для каталогов, которые вы хотите сделать: ln -sfT/location/to/new/target old_linkname

Ответ 5

В 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.

Ответ 6

Просто измените цель символической ссылки:

# ln -sfT /path/to/new/target linkname

Это мгновенное атомное изменение.

Ответ 7

Нет. Системный вызов symlink возвращает EEXIST, если новый путь уже существует. Вы можете ссылаться только на новый node в файловой системе. Какое требование здесь? Если вас беспокоит гонка из-за неатомобильности вызовов unlink/symlink, вы можете немного переосмыслить архитектуру, чтобы обеспечить синхронизацию в другом месте. Там были некоторые страшные ошибки безопасности, введенные в этом виде.

Ответ 8

Настройте команды следующим образом:

rm currentlink && ln -s /path/to/link currentlink

Первая команда удаляет существующую, а вторая сразу создает ее снова.

Ответ 9

Как уже упоминалось, вы в основном должны сначала удалить символическую ссылку, либо вручную, либо передав флаг -f утилите ln.

Несколько лет назад мне приходилось делать небольшие изменения для символических ссылок довольно часто, поэтому я написал простую утилиту на основе readline (edln), чтобы сделать это менее раздражающим. В случае, если кто-либо найдет это полезным, я разместил его в Интернете https://github.com/jjlin/edln/.

edln отобразит исходную цель символической ссылки; вы можете использовать клавиши со стрелками или стандартные нажатия клавиш (M-b, M-f, C-d и т.д.) для перемещения и редактирования цели.

Ответ 10

Просто погуглил, не нашел хорошего ответа и решил самому решить:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

Редактирование по определению означает не воссоздание с нуля, а изменение частично. Любой ответ, требующий запоминания пути, может быть, длинного или со странными символами, определенно плох.