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
편집 : OP가 주석에서 지적했듯이 --force
옵션을 사용하면 이전에 ln
시스템 호출을 수행합니다 . 아래 는 내 리눅스 박스에 대한 출력입니다 .unlink()
symlink()
strace
$ 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
그래서 최종 답은 "아니오"라고 생각합니다.
편집 : 다음은 2016 년경 unix.stackexchange.com 에서 Arto Bendiken의 답변 에서 복사되었습니다 .
이 수 실제로 원자 적으로 수행 할 수 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
리눅스 다릅니다.
FreeBSD에서는 mv -h
교대로 사용하십시오 .
편집자 주 : 이것이 Capistrano가 ~ 2.15 이후 수년 동안해온 방법입니다. 이 pull 요청을 참조하십시오 .
ln
명령 (또는 이에 상응하는 API)을 실행하여 이전 링크를 덮어 쓰지 않는 이유는 무엇 입니까? 어떤 문제가 있습니까?