- How can I edit symlinks?
- 7 Answers 7
- Изменение символической ссылки
- Команда Ln: как создавать символические ссылки в Linux
- Команда Ln для создания символических ссылок
- Создать символическую ссылку на каталог Linux
- Принудительно перезаписать символические ссылки
- Удаление ссылок
- Soft Links против Hard Links
- Символические ссылки (Soft Links)
- Жесткие ссылки (Hard Links)
How can I edit symlinks?
My basic understanding of a symlink is that it’s a special file, a file that contains a string path to another file. The kernel’s VFS abstracts a lot of that away but is there any reason why symlinks seem to be impossible to edit? In other words: Can I edit a symlink? If not, why not? I do understand that there are various ways of replacing symlinks (two alternatives are currently in the answers section) but it would be interesting to get an explanation on why replacement seems to be the only way to deal with symlinks. Why can’t you just change where they point?
Your understanding is a bit limited; the only reason it’s called a ‘file’ is because there’s no better word for it.
Unlike the embarrassing atrocity that is the windows variant, posix-style symbolic links operate on/in the filesystem layer itself. The only way to edit one would be to edit the filesystem directly — and it’s generally not worth it.
@Shadur .lnk files are not really symlinks to begin with (and NTFS has had proper symlinks since Vista); they’re more like shortcuts for executing commands, whether that is changing to a specific folder or starting a program with specific arguments and with a certain CWD.
7 Answers 7
ln -s /location/to/link linkname # . ln -s /location/to/link2 newlink mv -T newlink linkname
linkname is accessible throughout the process.
That does get you the atomic replacement, though you still are doing a replace rather than edit ( new link has a new inode number ).
@psusi I completely agree, it’s just a technically slightly better option than the other answer in some scenarios.
If you’re redirecting the link to another destination then changing it’s inode number seems like a small change.
That assumes linkname is not a symlink to a directory. Use the -T option to mv if on GNU or -h if on FreeBSD to avoid that. Note that like ln -sf that does not preserve the permissions of the link (on systems where they are significant).
Another solution for change symlink for directory is to use -n options e.g.: ln -sfn DESTINATION_DIRECTORY LINK_NAME . Read more on askubuntu.com/a/186227/69004
If by edit, you mean to change the file it points to, then yes you can:
$ 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
The -f parameter ( —force ) when passed to ln it causes it to call the unlink() system call right before symlink()
I think it’s questionable if this can be regarded as «edit», since unlink();symlink(); is not atomic, so there is a tiny tiny amount of time during which the link does not exist.
@mauro.stettler Yes, you are right. But I guess that this depends on your perspective. If you take only the end result into account, then maybe you could consider it as edited, no other things considered.
The quoted section from the Unix Time Sharing System paper describes hard links. These are entirely different from the symbolic links (symlinks) the OP asked about.
Note that it assumes test ‘s target is not a directory. Otherwise ln -s -f .profile test would create a .profile symlink in that directory. GNU ln has a -T option to avoid that.
Symbolic links need to be modified atomically. If you’re halfway through writing them, they won’t work. The content of a symbolic link is pretty small (at most 4095 characters on Linux: the maximum length of a path to a file), so there would be little point in editing part of a symbolic link at the kernel level. Therefore the kernel does not offer any interface to edit a symbolic link, only an interface to create a new one, the symlink system call (plus the generic interface unlink to remove any file).
The symlink system call only creates a new symbolic link, it does not remove any existing file. This is annoying, but consistent with other system calls to create files such as open (which can create a new file or truncate an existing file, but not replace an existing file by a newly-created file) and mkdir .
In the shell, as you’ve discovered, while you can’t replace a symbolic link atomically with the ln command ( ln -sf unlinks the previous file then creates the symbolic link), you can do it by first creating a symbolic link under a temporary name and then moving it into place.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp) ln -sf -- "$target" "$tmp" mv -f "$tmp" "$link"
Изменение символической ссылки
Есть возможность редактировать символическую ссылку, не заменяя ее новой? Потому что есть много жестких ссылок на этот файл (симв. ссылку), и пришлось бы менять все жесткие ссылки.
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
Команда Ln: как создавать символические ссылки в Linux
Символические ссылки используются в Linux для управления файлами и их сопоставления.
В этом руководстве вы узнаете, как использовать команду ln для создания символических ссылок в Linux.
Команда Ln для создания символических ссылок
Чтобы использовать команду ln, откройте окно терминала и введите команду в следующем формате:
- По умолчанию команда ln создает hard link (жесткая ссылка).
- Используйте параметр -s , чтобы создать символическую ссылку, она же soft link.
- Параметр -f заставит команду перезаписать уже существующий файл.
- Source — это файл или каталог, на который делается ссылка.
- Destination — это место для сохранения ссылки — если это поле не заполнено, символическая ссылка сохраняется в текущем рабочем каталоге.
Например, создайте символическую ссылку с помощью:
ln -s test_file.txt link_file.txt
Это создает символическую ссылку link file.text , которая указывает на testfile.txt .
Чтобы проверить, создана ли символическая ссылка, используйте команду ls :
Создать символическую ссылку на каталог Linux
Символическая ссылка может относиться к каталогу. Чтобы создать символическую ссылку на каталог в Linux:
ln -s /mnt/external_drive/stock_photos ~/stock_photos
В этом примере создается символическая ссылка с именем stock_photos в домашнем каталоге ~ / . Ссылка относится к каталогу stock_photos на внешнем диске external_drive .
Примечание. Если система подключена к другому компьютеру, например к корпоративной сети или удаленному серверу, символические ссылки могут быть связаны с ресурсами в этих удаленных системах.
Принудительно перезаписать символические ссылки
Вы можете получить сообщение об ошибке, как показано на изображении ниже:
Сообщение об ошибке означает, что в месте назначения уже есть файл с именем link_file.txt . Используйте параметр -f , чтобы система перезаписывала целевую ссылку:
ln -sf test_file.txt link_file.txt
Удаление ссылок
Если исходный файл будет перемещен, удален или станет недоступным (например, сервер отключится), ссылку нельзя будет использовать. Чтобы удалить символическую ссылку, используйте команду rm (remove) или unlink :
rm link_file.txt unlink link_file.txt
Soft Links против Hard Links
Команду ln можно использовать для создания двух разных типов ссылок:
Символические ссылки (Soft Links)
Символическая ссылка, иногда называемая мягкой ссылкой или soft link, указывает на расположение или путь к исходному файлу. Она работает как гиперссылка в Интернете.
Вот несколько важных аспектов символической ссылки:
- Если файл символьной ссылки удаляется, исходные данные остаются.
- Если исходный файл будет перемещен или удален, символическая ссылка работать не будет.
- Символическая ссылка может относиться к файлу в другой файловой системе.
- Символические ссылки часто используются для быстрого доступа к часто используемым файлам без ввода всего местоположения.
Жесткие ссылки (Hard Links)
Когда файл хранится на жестком диске, происходит несколько вещей:
- Данные физически записываются на диск.
- Создается справочный файл, называемый индексом, который указывает на расположение данных.
- Имя файла создается для ссылки на данные inode.
Жесткая ссылка работает путем создания другого имени файла, которое ссылается на данные inode исходного файла. На практике это похоже на создание копии файла.
Вот несколько важных аспектов жестких ссылок:
- Если исходный файл удален, к данным файла все равно можно будет получить доступ через другие жесткие ссылки.
- Если исходный файл перемещен, жесткие ссылки по-прежнему работают.
- Жесткая ссылка может относиться только к файлу в той же файловой системе.
- Если количество жестких ссылок равно нулю, индексный дескриптор и данные файла удаляются безвозвратно.