Не уверенный я понимаю правильно, но не можете Вы просто:
~] umount /sys/fs/cgroup/group/subgroup/5G7ds/
~] rmdir /sys/fs/cgroup/group/subgroup/5G7ds/
Вышеупомянутые размонтирования cgroup и удаляют его.
Учитывая, что -f
просто делает тихую замену, можно сделать атомарную замену с mv -T
(-T заставляет его работать, даже если / местоположение.../ссылка является каталогом):
ln -s /location/to/link linkname
# ...
ln -s /location/to/link2 newlink
mv -T newlink linkname
linkname
доступно в течение процесса.
Если редактированием, Вы означаете изменять файл, это указывает на, то да Вы можете:
$ 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()
Взятый из следующего ответа переполнения стека.
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"
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
Я нашел файл ссылки "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
поэтому длинное имя файла ссылки по-прежнему содержит старый путь, но указывает на новый путь. Есть ли способ изменить этот идентификатор? Не то чтобы это меня сильно беспокоило. Ссылка теперь работает нормально.
linkname
не символьная ссылка на каталог. Используйте-T
опция кmv
если на GNU или-h
если на FreeBSD для предотвращения этого. Отметьте это какln -sf
это не сохраняет полномочия ссылки (в системах, где они являются значительными). – Stéphane Chazelas 07.11.2014, 16:48-n
опции, например:ln -sfn DESTINATION_DIRECTORY LINK_NAME
. Читайте больше на askubuntu.com/a/186227/69004 – sobi3ch 18.11.2015, 17:15