AFAIK, ні, ви не можете. Ви повинні його зняти і відтворити. Насправді ви можете перезаписати символьне посилання і таким чином оновити ім'я шляху, на яке посилається:
$ 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
РЕДАКТУВАННЯ : Як в коментарі вказано в ОП, за допомогою цього --force
параметра ln
виклик буде виконувати системний дзвінок unlink()
раніше symlink()
. Нижче, висновок strace
на моєму вікні linux, що підтверджує це:
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
Тому я здогадуюсь, що остаточна відповідь - «ні».
EDIT : Далі скопійовано з відповіді Арто Бендікена на unix.stackexchange.com, близько 2016 року.
Це може дійсно бути зроблено атомарному з rename(2)
, спочатку створити нову символічну посилання під тимчасовим ім'ям , а потім акуратно перезаписувати старий симлінк на одному диханні. Як зазначено на сторінці чоловіка :
Якщо newpath посилається на символічне посилання, посилання буде перезаписано.
У оболонці ви зробите це mv -T
наступним чином:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Ви можете strace
виконати цю останню команду, щоб переконатися, що вона справді використовується rename(2)
під кришкою:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Зауважимо, що у вищесказаному і те, mv -T
і інше strace
є Linux.
У FreeBSD використовуйте по mv -h
черзі.
Примітка редактора: Ось як це робив Капістрано протягом багатьох років, починаючи з ~ 2.15. Дивіться цей запит на витяг .
ln
команду (або еквівалент API), перезаписавши старе посилання? Яка у вас проблема?