AFAIK, không, bạn không thể. Bạn phải loại bỏ nó và tạo lại nó. Trên thực tế, bạn có thể ghi đè lên một liên kết tượng trưng và do đó cập nhật tên đường dẫn được tham chiếu bởi nó:
$ 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 : Như OP đã chỉ ra trong một bình luận, sử dụng --force
tùy chọn sẽ thực ln
hiện cuộc gọi hệ thống unlink()
trước đó symlink()
. Dưới đây, đầu ra của strace
hộp linux của tôi chứng minh điều đó:
$ 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
Vì vậy, tôi đoán câu trả lời cuối cùng là "không".
EDIT : Phần sau đây được sao chép từ câu trả lời của Arto Bendiken trên unix.stackexchange.com, vào khoảng năm 2016.
Điều này thực sự có thể được thực hiện bằng nguyên tử rename(2)
, bằng cách trước tiên tạo liên kết tượng trưng mới dưới tên tạm thời và sau đó ghi đè lên liên kết tượng trưng cũ trong một lần. Như trang người đàn ông nói:
Nếu newpath đề cập đến một liên kết tượng trưng, liên kết sẽ bị ghi đè.
Trong shell, bạn sẽ làm điều này mv -T
như sau:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Bạn có thể strace
thực hiện lệnh cuối cùng để đảm bảo rằng nó thực sự được sử dụng rename(2)
dưới mui xe:
$ 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
Lưu ý rằng ở trên, cả hai mv -T
và strace
đều dành riêng cho Linux.
Trên FreeBSD, sử dụng mv -h
luân phiên.
Lưu ý của biên tập viên: Đây là cách Capistrano đã thực hiện nó trong nhiều năm nay, kể từ ~ 2,15. Xem yêu cầu kéo này .
ln
lệnh (hoặc API tương đương) ghi đè lên liên kết cũ? Bạn gặp vấn đề gì?