심볼릭 링크 대상을 업데이트하는 방법(ln -f -s가 작동하지 않음)

심볼릭 링크 대상을 업데이트하는 방법(ln -f -s가 작동하지 않음)

나는 사용하고있다

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

관련 정보