Изменить символическую ссылку linux

Now I want to change the location that the symlink links to. How do I do that? is there a way to do it without deleting it first?

10 Answers 10

You could create the new link with a different name, then move it to replace the old link.

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

If newlink and linkname are on the same physical device the mv should be atomic.

FYI, i’m sure this works on some os but this didn’t work for me, the move operation just removed the ‘new’ link instead of replacing the old one. i still had to rm first.

@pstanton You mean that mv newlink linkname caused the newlink file to be deleted, but didn’t overwrite the linkname file? Did it do this silently? That seems extremely mysterious.

mv newlink linkname will move your newlink into linkname if they are directories. So this method is not 100% perfect.

Try ln -sf new_destination linkname .

This is non-atomic, though. See my answer for details. I’m not clear whether that’s the poster’s concern or not.

This also won’t work with symlinks pointing to directories. It will just create a new symlink inside the old target directory.

Just change the symlink target:

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

This is an instant, atomic change.

-T, —no-target-directory treat LINK_NAME as a normal file always you can brew install coreutils and access the GNU versions with a g prefix, like gln if you want the GNU versions on macOS. saves a lot of headache when there are subtle differences like this.

If the symlink targets are directories, you need to add the -T flag to the mv command, otherwise it moves the new symlink in to the target directory of the old symlink.

Example of atomically switching a website to a new version:

Original setup — website is stored in www1 directory, vhost pointing at www symlink:

Browse to website, see old version.

Put new website files in new www2 directory.

Set up new symlink to new website:

Move www symlink to directory of new website:

Browse to website, see new version immediately.

So apparently the version of mv on my NAS’s microkernel doesn’t support the -T argument. Any alternative suggestions for doing this atomically?

Try creating the symlink with the -f (force) flag. That seems to work. See the answer below: ln -sf new_destination linkname

On OSX, the man page for ln says you can do it like this

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. 

Источник

Читайте также:  Linux путь к dvd

Изменение символической ссылки

Есть возможность редактировать символическую ссылку, не заменяя ее новой? Потому что есть много жестких ссылок на этот файл (симв. ссылку), и пришлось бы менять все жесткие ссылки.

ln -f -s /new/target /your/existing/symlink

Жёсткие ссылки на симлинк — это жёстко! 🙂

-f, —force
remove existing destination files

Нужно без удаления файла. Нужно изменить цель существующей симлинки.

mc
F9
символическая ссылка
или
Ctrl+x+s

ёпрст. ты сначала сделай а потом пиши. inode симлинка после такой операции не изменяется, значит жёсткая ссылка на твой симлинк сохраняется. ты дядю слушай.

только что попробовал:
ln -s file s1
ln s1 s2
ln s1 s3

Есть три символические ссылки s1 s2 s3, которые являются одним файлом:
s1 -> file
s2 -> file
s3 -> file

Перезаписываем одну из них:
ln -s -f apple s1

Теперь:
s1 -> apple
s2 -> file
s3 -> file

хм. с тремя файлами инод меняется. вот фак. тогда точно жопа. т.к. по иноду файл открыть нереально. можно конечно найти все файлы с одинаковыми инодами, и пересоздать их после изменения симлинка. можно использовать find -inum

Источник

Как я могу редактировать символические ссылки?

Мое базовое понимание символической ссылки — это специальный файл, файл, содержащий строковый путь к другому файлу. VFS ядра абстрагирует многое из этого, но есть ли причина, по которой символические ссылки кажутся невозможными для редактирования?

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

Я понимаю, что существуют различные способы замены символических ссылок (в настоящее время в разделе ответов есть две альтернативы), но было бы интересно получить объяснение того, почему замена кажется единственным способом справиться с символическими ссылками. Почему вы не можете просто изменить, куда они указывают?

Ваше понимание немного ограничено; единственная причина, по которой он называется «файлом», заключается в том, что лучшего слова для этого нет.

В отличие от смущающего зверства, являющегося вариантом windows, символические ссылки в стиле posix работают на / в самом уровне файловой системы. Единственный способ отредактировать один — это отредактировать файловую систему напрямую — и, как правило, это того не стоит.

Файлы @Shadur .lnk на самом деле не являются символическими ссылками для начала (а NTFS имеет правильные символические ссылки начиная с Vista); они больше похожи на ярлыки для выполнения команд, будь то изменение в определенной папке или запуск программы с определенными аргументами и с определенным CWD.

ln -s /location/to/link linkname # . ln -s /location/to/link2 newlink mv -T newlink linkname 

linkname доступен на протяжении всего процесса.

Читайте также:  Linux посмотреть модель hdd

Это дает вам атомную замену, хотя вы по-прежнему делаете замену, а не редактируете (новая ссылка имеет новый номер инода).

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

Это предполагает, что linkname это не символическая ссылка на каталог. Чтобы избежать этого, используйте -T опцию, mv если в GNU или -h во FreeBSD. Обратите внимание, что подобное ln -sf не сохраняет права ссылки (в системах, где они значимы).

Еще одно решением для изменения линка для каталога является использование -n опции , например: ln -sfn DESTINATION_DIRECTORY LINK_NAME . Узнайте больше на askubuntu.com/a/186227/69004

Если под редактированием вы хотите изменить файл, на который он указывает, то да, вы можете:

$ ln -s .bashrc test $ ls -al test lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc $ ln -s .profile test ln: creating symbolic link `test': File exists $ ln -s -f .profile test $ ls -al test lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile 

-f Параметр ( —force ) при передаче в пер это заставляет его вызвать unlink() системный вызов прямо перед symlink()

Я думаю, это сомнительно, если это можно рассматривать как «редактировать», так как unlink (); symlink (); не является атомарным, поэтому существует крошечный промежуток времени, в течение которого ссылка не существует.

@ mauro.stettler Да, вы правы. Но я думаю, что это зависит от вашей точки зрения. Если вы принимаете во внимание только конечный результат, то, возможно, вы могли бы рассмотреть его как отредактированный, без каких-либо других вещей.

В цитируемом разделе статьи Unix Time Sharing System описаны жесткие ссылки. Они полностью отличаются от символических ссылок (символических ссылок), о которых спрашивал ОП.

Обратите внимание, что предполагается, test что цель не является каталогом. В противном случае ln -s -f .profile test создаст .profile символическую ссылку в этом каталоге. У GNU ln есть -T возможность избежать этого.

Символические ссылки должны быть изменены атомарно. Если вы наполовину пишете их, они не сработают. Содержимое символической ссылки довольно мало (не более 4095 символов в Linux: максимальная длина пути к файлу), поэтому нет смысла редактировать часть символической ссылки на уровне ядра. Поэтому ядро ​​не предлагает никакого интерфейса для редактирования символической ссылки, только интерфейс для создания новой, symlink системный вызов (плюс универсальный интерфейс unlink для удаления любого файла).

symlink Системный вызов только создает новую символическую ссылку, он не удаляет существующий файл. Это раздражает, но согласуется с другими системными вызовами для создания файлов, таких как open (которые могут создать новый файл или обрезать существующий файл, но не заменить существующий файл вновь созданным файлом) и mkdir .

В оболочке, как вы обнаружили , хотя вы не можете атомарно заменить символическую ссылку ln командой ( ln -sf отсоединяет предыдущий файл, а затем создает символическую ссылку), вы можете сделать это, сначала создав символическую ссылку под временным именем и затем переместить его на место.

tmp=$(TMPDIR=$(dirname -- "$link") mktemp) ln -sf -- "$target" "$tmp" mv -f "$tmp" "$link" 

mv -f (как ln -sf ) не будет делать то, что вы хотите, если $link указывает на каталог. У GNU ln и mv есть -T для этого. mv (переименовать системный вызов) всегда будет изменять inode, в $link то время как ln -sfT (unlink + symlink) может использовать то же самое.

Читайте также:  Opera русский язык linux

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

Вот небольшая функция bash / zsh, которую я написал для обновления существующей символической ссылки:

# ----------------------------------------- # Edit an existing symbolic link # # @1 = Name of symbolic link to edit # @2 = Full destination path to update existing symlink with # ----------------------------------------- function edit-symlink () < if [ -z "$1" ]; then echo "Name of symbolic link you would like to edit:" read LINK else LINK="$1" fi LINKTMP="$LINK-tmp" if [ -z "$2" ]; then echo "Full destination path to update existing symlink with:" read DEST else DEST="$2" fi ln -s $DEST $LINKTMP rm $LINK mv $LINKTMP $LINK printf "Updated $LINK to point to new destination ->$DEST" > 

Привет @ user2233709 — на вопрос пользователя « Как я могу отредактировать символические ссылки? » Был дан четкий ответ в первом предложении, а также в предложении решения. Не могли бы вы уточнить?

Вы действительно прочитали вопрос? Речь идет о том, можно ли изменить символическую ссылку, а не заменить ее. Предлагаемое вами «решение» — это скрипт, который заменяет символическую ссылку.

Предположим, что linkname существует в результате выполнения (в прошлом):

 ln -s /the/path/to/a/file linkname 

Затем есть три способа изменить символическую ссылку:

    Используйте ln с -f силой и даже для каталогов -n (inode может быть использован повторно):

ln -sfn /some/new/path linkname 
rm linkname; ln -s /some/new/path linkname 
ln -s /some/new/path newlinkname mv -fT newlinkname linkname # linkname remains after the command 

Источник

But the permission of the soft link is not getting changed. What am I missing here to change the permission of the link?

3 Answers 3

On a Linux system, when changing the ownership of a symbolic link using chown , by default it changes the target of the symbolic link (ie, whatever the symbolic link is pointing to).

If you’d like to change ownership of the link itself, you need to use the -h option to chown :

-h, —no-dereference affect each symbolic link instead of any referenced file (useful only on systems that can change the ownership of a symlink)

$ touch test $ ls -l test* -rw-r--r-- 1 mj mj 0 Jul 27 08:47 test $ sudo ln -s test test1 $ ls -l test* -rw-r--r-- 1 mj mj 0 Jul 27 08:47 test lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test $ sudo chown root:root test1 $ ls -l test* -rw-r--r-- 1 root root 0 Jul 27 08:47 test lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test 

Note that the target of the link is now owned by root.

$ sudo chown mj:mj test1 $ ls -l test* -rw-r--r-- 1 mj mj 0 Jul 27 08:47 test lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test 

And again, the link test1 is still owned by root, even though test has changed.

$ sudo chown -h mj:mj test1 $ ls -l test* -rw-r--r-- 1 mj mj 0 Jul 27 08:47 test lrwxrwxrwx 1 mj mj 4 Jul 27 08:47 test1 -> test 

And finally we change the ownership of the link using the -h option.

Источник

Оцените статью
Adblock
detector