나는 사용하고있다
ln -f -s /var/www/html/releases/build1390 앱-현재
새로운 대상으로 심볼릭 링크 "app-current"를 업데이트합니다. 그러나 이것은 작동하지 않습니다. "app-current" 링크는 원래 대상을 유지하지만 오류는 발생하지 않습니다...
링크를 제거하고 다시 만드는 것이 아니라 기존 링크의 대상을 업데이트하기만 하면 됩니다. 그게 가능합니까?
답변1
그것은 나에게 효과적입니다. 의 결과는 무엇입니까 strace ln -f -s /var/www/html/releases/build1390 app-current
?
아, 역참조 없이 추가해야 하는 디렉토리이므로 -n
문제가 해결될 것입니다. -f
-f를 추가하면 어쨌든 연결이 해제되므로 실제로 더 편리합니다. 일반적으로 로드된 시스템에서는 아마도 수백 ms 더 빠르게 발생할 것이라고 생각합니다.
예를 들어, arf가 이미 /home을 가리키는 경우:
다음과 함께 -n
:
strace ln -n -f -s / arf
...
symlink("/", "arf") = -1 EEXIST (File exists)
unlink("arf") = 0
symlink("/", "arf") = 0
없이 -n
:
strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: ) = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1) = 1
따라서 arf가 없으면 -n
역참조되므로 ln은 이를 마치 arf인 것처럼 처리합니다 /
. 특정 예에서 오류가 없다면 아마도 내부에 새로운 심볼릭 링크를 만들었고 /var/www/html/releases/build1390 app-current
이를 정리하고 싶을 것입니다.
답변2
대상이 심볼릭 링크인 경우 대상이 역참조되는 것을 방지하기 위해 -n
또는 를 사용할 수 있습니다 . 또는 를 --no-dereference
사용하여 대상 파일이-T
--no-target-directory
언제나일반 파일로 취급됩니다.
다음 예제에서 볼 수 있듯이 이는 약간 다른 동작을 생성합니다. src
어떤 파일이 dirlink
디렉토리에 대한 심볼릭 링크이고 dir
실제 디렉토리라고 가정합니다 .
사용 -n
:
ln -sfn src dirlink
덮어쓰고dirlink
연결합니다.src
ln -sfn src dir
링크를 생성합니다dir/src -> src
사용 -T
:
ln -sfT src dirlink
덮어쓰고dirlink
연결합니다.src
ln -sfT src dir
오류 메시지가 생성됩니다.ln: ‘dir’: cannot overwrite directory