AFAIK, tidak, Anda tidak bisa. Anda harus menghapusnya dan membuatnya kembali. Sebenarnya, Anda dapat menimpa sebuah symlink dan dengan demikian memperbarui nama jalur yang dirujuk olehnya:
$ 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
EDIT : Seperti yang ditunjukkan OP dalam komentar, menggunakan --force
opsi ini akan membuat ln
panggilan sistem ke unlink()
sebelumnya symlink()
. Di bawah ini, output strace
di kotak linux saya membuktikannya:
$ 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
Jadi saya kira jawaban akhirnya adalah "tidak".
EDIT : Berikut ini disalin dari jawaban Arto Bendiken di unix.stackexchange.com, sekitar tahun 2016.
Ini dapat memang dilakukan atom dengan rename(2)
, dengan terlebih dahulu menciptakan symlink baru di bawah nama sementara dan kemudian bersih Timpa symlink lama dalam satu pergi. Seperti yang dinyatakan halaman manual :
Jika jalur baru mengacu pada tautan simbolis, tautan tersebut akan ditimpa.
Di shell, Anda akan melakukan ini dengan mv -T
sebagai berikut:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Anda dapat melakukan strace
perintah terakhir itu untuk memastikannya memang menggunakan di rename(2)
bawah tenda:
$ 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
Perhatikan bahwa di atas, keduanya mv -T
dan strace
khusus untuk Linux.
Di FreeBSD, gunakan secara mv -h
bergantian.
Catatan editor: Beginilah cara Capistrano melakukannya selama bertahun-tahun sekarang, sejak ~ 2.15. Lihat permintaan tarik ini .
ln
perintah (atau API yang setara) menimpa tautan lama? Masalah apa yang Anda hadapi?