AFAIK ไม่คุณทำไม่ได้ คุณต้องลบออกและสร้างใหม่ จริงๆแล้วคุณสามารถเขียนทับ symlink และอัปเดตชื่อพา ธ ที่อ้างถึงได้:
$ 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
แก้ไข : ตามที่ OP ชี้ให้เห็นในความคิดเห็นการใช้--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
ดังนั้นฉันเดาว่าคำตอบสุดท้ายคือ "ไม่"
แก้ไข : สิ่งต่อไปนี้คัดลอกมาจากคำตอบของ Arto Bendikenบน unix.stackexchange.com ประมาณปี 2016
สิ่งนี้สามารถทำได้โดยใช้อะตอมrename(2)
โดยการสร้าง symlink ใหม่ก่อนโดยใช้ชื่อชั่วคราวจากนั้นเขียนทับ symlink เก่าอย่างหมดจดในครั้งเดียว ตามที่หน้าคนระบุ:
หาก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
สลับกัน
หมายเหตุบรรณาธิการ:นี่คือวิธีที่ Capistrano ทำมาหลายปีแล้วนับตั้งแต่ ~ 2.15 ดูคำขอดึงนี้
ln
คำสั่ง (หรือความเท่าเทียมกันของ API) เขียนทับลิงก์เก่า คุณมีปัญหาอะไร