나는 사용하고있다
ln -f -s / var / www / html / releases / build1390 app-current
“app-current”기호 링크를 새 대상으로 업데이트합니다. 그러나 이것은 작동하지 않습니다. “app-current”링크는 원래 대상을 유지하지만 오류가 발생하지 않습니다 …
오히려 링크를 제거하고 다시 작성하지 않고 기존 링크의 대상을 업데이트하기 만하면됩니다. 가능합니까?
답변
그것은 저에게 효과적입니다. 결과는 strace ln -f -s /var/www/html/releases/build1390 app-current
무엇입니까?
아, 그것은 디렉토리이기 때문에 -n
역 참조없이 추가 해야하며 이것은 문제를 해결해야합니다. -f
-f를 추가하면 어쨌든 연결이 끊어지기 때문에 실제로는 더 편리합니다. 비록 정상적으로로드 된 시스템에서는 아마도 수백 ms 더 빠를 것이라고 생각합니다.
예를 들어, arf가 이미 / home을 가리키는 경우 :
strace with -n
:
strace ln -n -f -s / arf
...
symlink("/", "arf") = -1 EEXIST (File exists)
unlink("arf") = 0
symlink("/", "arf") = 0
strace Without -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
따라서 -n
arf가 없으면 역 참조되기 때문에 ln은 실제로 마치 마치 arf로 처리합니다 /
. 귀하의 특정 예에서 오류가 없다면 내부에 새로운 심볼릭 링크를 만들었을 것이라고 생각합니다 /var/www/html/releases/build1390 app-current
.
답변
대상이 심볼릭 링크 인 경우 -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