Есть ли способ редактировать символическую ссылку, не удаляя ее в первую очередь? [дубликат]
этот вопрос уже есть ответ здесь:
Я создал символическую ссылку:
ln -s /location/to/link linkname
теперь я хочу изменить местоположение, на которое ссылается символическая ссылка. Как мне это сделать? есть ли способ сделать это, не удаляя его в первую очередь?
10 ответов:
вы можете создать новую ссылку с другим именем, а затем переместить ее, чтобы заменить старую ссылку.
ln -s /location/to/link linkname
позже
ln -s /location/to/link2 newlink mv newlink linkname
если
newlink
иlinkname
находятся на одном физическом устройствеmv
должен быть атомным.
если цели символической ссылки являются каталогами, вам нужно добавить
-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
это мгновенное, атомарное изменение.
на 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
редактирование по определению означает не воссоздание с нуля, а частичное изменение. Любой ответ, требующий запоминания пути, может быть длинным или со странными символами, определенно плох.