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


этот вопрос уже есть ответ здесь:

Я создал символическую ссылку:

ln -s /location/to/link linkname

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

10 53

10 ответов:

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

ln -s /location/to/link linkname

позже

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

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

попробовать ln -sf new_destination linkname.

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

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

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

ln -s www1 www

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

поместите новые файлы веб-сайта в новый .

настройка новой символической ссылки на новый сайт:

ln -s www_new www2

движение www символическая ссылка на каталог нового сайта:

mv -T www_new www

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

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

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

это мгновенное, атомарное изменение.

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

на OSX, man-страница для ln говорит, что вы можете сделать это так

ln -shf /location/to/link link name

С главной страницы:

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.

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

цепочка команд выглядит так:

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

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

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

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

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

просто погуглил, не нашел хорошего ответа и должен был решить сам:

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

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