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


45

나는 사용하고있다

ln -f -s / var / www / html / releases / build1390 app-current

"app-current"기호 링크를 새 대상으로 업데이트합니다. 그러나 이것은 작동하지 않습니다. "app-current"링크는 원래 대상을 유지하지만 오류가 발생하지 않습니다 ...

오히려 링크를 제거하고 다시 작성하지 않고 기존 링크의 대상을 업데이트하기 만하면됩니다. 가능합니까?

답변:


55

그것은 저에게 효과적입니다. 결과는 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

따라서 -narf가 없으면 역 참조되기 때문에 ln은 실제로 마치 마치 arf로 처리합니다 /. 귀하의 특정 예에서 오류가 없다면 내부에 새로운 심볼릭 링크를 만들었을 것이라고 생각합니다 /var/www/html/releases/build1390 app-current.


4
대단한 일이 바로 -n입니다. 고마워요!
solsol

12

대상이 심볼릭 링크 인 경우 -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

1
Linux 사용자에게는 가장 정확하고 간결한 답변이 있습니다.
ross

오류 메시지가 표시되지 않도록 대상 디렉토리를 강제로 덮어 쓰는 방법이 cannot overwrite directory있습니까?
gitaarik

@rednaw 몇 개의 명령을 연결하여이 작업을 수행 할 수 있지만 ln디렉토리 자체를 제거하지는 않습니다. 아마도 많은 수의 파일을 재귀 적으로 제거해야하므로 나쁜 생각 일 것입니다.
augurar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.