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

Не уверенный я понимаю правильно, но не можете Вы просто:

~] umount /sys/fs/cgroup/group/subgroup/5G7ds/
~] rmdir /sys/fs/cgroup/group/subgroup/5G7ds/

Вышеупомянутые размонтирования cgroup и удаляют его.

66
30.08.2013, 11:21
5 ответов

Учитывая, что -f просто делает тихую замену, можно сделать атомарную замену с mv -T (-T заставляет его работать, даже если / местоположение.../ссылка является каталогом):

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

linkname доступно в течение процесса.

37
27.01.2020, 19:32
  • 1
    Это действительно получает Вас атомарная замена, хотя Вы все еще делаете замену, а не редактирование (новая ссылка имеет новое inode число). –  psusi 30.08.2013, 16:28
  • 2
    @psusi я полностью согласен, это - просто технически немного более оптимальный вариант, чем другой ответ в некоторых сценариях. –  Oli 30.08.2013, 16:34
  • 3
    При перенаправлении ссылки на другое место назначения, затем изменяющееся, это - inode число, походит на небольшое изменение. –  ams 30.08.2013, 16:58
  • 4
    Это принимает linkname не символьная ссылка на каталог. Используйте -T опция к mv если на GNU или -h если на FreeBSD для предотвращения этого. Отметьте это как ln -sf это не сохраняет полномочия ссылки (в системах, где они являются значительными). –  Stéphane Chazelas 07.11.2014, 16:48
  • 5
    Другое решение для символьной ссылки изменения для каталога состоит в том, чтобы использовать -n опции, например: ln -sfn DESTINATION_DIRECTORY LINK_NAME . Читайте больше на askubuntu.com/a/186227/69004 –  sobi3ch 18.11.2015, 17:15

Если редактированием, Вы означаете изменять файл, это указывает на, то да Вы можете:

$ 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) при передаче ln он заставляет это звонить unlink() системный вызов прямо прежде symlink()

Взятый из следующего ответа переполнения стека.

23
27.01.2020, 19:32
  • 1
    я думаю, что сомнительно, может ли это рассматриваться как "редактирование", с тех пор удаляет связь (); символьная ссылка (); не является атомарным, таким образом, существует крошечное крошечное количество времени, во время которого не существует ссылка. –  replay 30.08.2013, 11:15
  • 2
    @mauro.stettler Да, Вы правы. Но я предполагаю, что это зависит от Вашей перспективы. Если Вы принимаете во внимание только конечный результат, то, возможно, Вы могли рассмотреть это, как отредактировано, никакие другие вещи рассмотренный. –  NlightNFotis 30.08.2013, 11:17
  • 3
    Заключенный в кавычки раздел из Системной бумаги Разделения по времени Unix описывает жесткие ссылки. Они совершенно отличаются от символьных ссылок (символьные ссылки) OP, о котором спрашивают. –  Ansgar Esztermann 30.08.2013, 12:00
  • 4
    , которое это принимает testцель не является каталогом. Иначе ln -s -f .profile test создал бы a .profile символьная ссылка в том каталоге. GNU ln имеет a -T опция избежать этого. –  Stéphane Chazelas 07.11.2014, 16:13

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

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

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

tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"
10
27.01.2020, 19:32
  • 1
    mv -f (как ln -sf) не сделает то, что Вы хотите если $link точки к каталогу. GNU ln и mv имеют a -T для этого. mv (переименуйте системный вызов), будет всегда изменять inode $link в то время как ln -sfT (unlink+symlink) мог бы снова использовать то же. –  Stéphane Chazelas 07.11.2014, 16:07

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

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

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

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

    ln -sfn /some/new/path linkname
    
  • Удалите символическую ссылку и создайте новую (даже для каталогов):

    rm linkname; ln -s /some/new/path linkname
    
  • создать новую символическую ссылку, затем mvее (атомарное изменение даже для каталогов):

    ln -s  /some/new/path newlinkname
    mv -fT newlinkname linkname             # linkname remains after the command
    
2
27.01.2020, 19:32

Я нашел файл ссылки "gap" в своей папке ~/bin, должно быть, он был помещен туда каким-то процессом установки (Я сам никогда не использовал команду ln ). Я хотел перейти с gap -4.10.2 на gap -4.11.0, поэтому открыл файл ссылки, используя

vim gap

, но он открывался только для чтения -, поэтому я открыл его с помощью

sudo vim gap

, а затем я мог бы изменить его в режиме вставки.

Я только что отредактировал содержимое файла ссылки из

#!/bin/sh

GAP_EXE=$GAP_DIR
if [ "x$GAP_DIR" = "x" ]; then
  GAP_DIR=$(cd "/home/user/gap-4.10.2" && pwd)
  GAP_EXE=/home/user/gap-4.10.2
fi

exec "$GAP_EXE/gap" -l "$GAP_DIR;/home/user/.gap" "$@"

заменив оба числа на 4.11.0 соответственно (уже существующий путь ), чтобы он выглядел как

#!/bin/sh

GAP_EXE=$GAP_DIR
if [ "x$GAP_DIR" = "x" ]; then
  GAP_DIR=$(cd "/home/user/gap-4.11.0" && pwd)
  GAP_EXE=/home/user/gap-4.11.0
fi

exec "$GAP_EXE/gap" -l "$GAP_DIR;/home/user/.gap" "$@"

Затем сохраните и выйдите с помощью

:wq

Итак, ДА, вы МОЖЕТЕ редактировать файл ссылки.

Остается одна проблема :в /bin с

ls -l

имя по-прежнему

gap ->../gap-4.10.2/bin/gap.sh

поэтому длинное имя файла ссылки по-прежнему содержит старый путь, но указывает на новый путь. Есть ли способ изменить этот идентификатор? Не то чтобы это меня сильно беспокоило. Ссылка теперь работает нормально.

0
13.08.2020, 12:58

Теги

Похожие вопросы