예

상대 심볼릭 링크의 대상이 아닌 상대 심볼릭 링크를 가리키는 상대 심볼릭 링크를 만들고 싶습니다. 상대 심볼릭 링크를 생성할 때 실제 심볼릭 링크를 가리키는 대신 ln해결되는 것 같습니다 . 이 프로세스를 건너뛸 수 있습니까? 아래 예에서는 을 가리키는 것이 아니라 을 가리키고 싶습니다 .TARGETTARGETrsym-to-existing-rsym.txtrsym-to-target.txttarget.txt

아직 존재하지 않는 심볼릭 링크( 아래 예에서는 rsym-to-future-rsym.txt-> -> 체인) 를 가리키는 심볼릭 링크를 만들 때 작동합니다 .future-rsym-to-target.txttarget.txt

# Create initial structure
$ mkdir -p temp
$ touch temp/target.txt

# Now, create relative symlinks
$ ln -s -r temp/target.txt temp/rsym-to-target.txt
$ ln -s -r temp/rsym-to-target.txt temp/rsym-to-existing-rsym.txt
# Note that at this point temp/future-rsym-to-target.txt doesn't exist yet
$ ln -s -r temp/future-rsym-to-target.txt temp/rsym-to-future-rsym.txt
$ ln -s -r temp/target.txt temp/future-rsym-to-target.txt

$ tree -F temp/
# Note that rsym-to-existing-rsym.txt points to target.txt, not to rsym-to-target.txt
temp/
├── future-rsym-to-target.txt -> target.txt
├── rsym-to-existing-rsym.txt -> target.txt
├── rsym-to-future-rsym.txt -> future-rsym-to-target.txt
├── rsym-to-target.txt -> target.txt
└── target.txt

# Maybe the tools I'm using are just nice to me and resolve final paths?
# No, when I delete rsym-to-target.txt symlink rsym-to-existing-rsym.txt still points to target.txt
$ rm temp/rsym-to-target.txt
 tree -F temp/
temp/
├── future-rsym-to-target.txt -> target.txt
├── rsym-to-existing-rsym.txt -> target.txt
├── rsym-to-future-rsym.txt -> future-rsym-to-target.txt
└── target.txt

답변1

plain은 ln -s대상을 문자열로 취급합니다. 문자열이 기존 파일의 경로인지 여부는 중요하지 않습니다.

GNU 확장은 ln -sr대상을 파일 시스템 위치로 처리합니다. 그렇지 않으면 생성된 실제 대상이 잘못되기 때문에 대상의 디렉터리를 역참조해야 합니다.

mkdir /tmp/demo /tmp/foreign
cd /tmp/demo
mkdir child
ln -s -r foo child/foo        # -> ../foo
ln -s /tmp/foreign elsewhere
ln -s -r foo elsewhere/foo    # -> ../demo/foo ­­— not ../foo

이는 경로의 최종 구성 요소를 역참조하지 않고도 달성할 수 있지만 그렇지 않습니다.

이것수동주어진 디렉토리에 대한 링크를 얻는 방법을 설명하십시오. 을 사용하지 말고 ln -r대신 전화하세요.realpath(GNU coreutils의 일부이기도 함) 상대 경로를 구축합니다. 링크 이름을 전달하는지 아니면 링크가 생성될 디렉터리 이름을 전달하는지에 따라 호출이 달라집니다.

$dir디렉토리인 경우 :

ln -s -- "$(realpath -m --relative-to "$dir" -- "$target")" "$dir"

$linkname생성할 링크의 경로는 다음과 같습니다 .

ln -s -- "$(realpath -m --relative-to "$(dirname -- "$linkname")" -- "$target")" "$linkname"

관련 정보