Linux에서 상대 심볼릭 링크를 작성하는 방법


답변:


76
  1. 링크가있는 디렉토리로 이동하십시오
  2. 명령을 실행 ln -s ../some/other/file linkname

제공 한 경로는 파일과 함께 저장됩니다. 파일에 액세스하면 저장된 경로가 조회되고 파일을 기준으로 확장됩니다. 링크를 만들 때 어떤 디렉토리에 있었는지 알 수 없습니다.


22
아뇨 현재 디렉토리 대신 링크 이름에 상대적인 위치를 지정해야합니다.
Ignacio Vazquez-Abrams

5
이해를 돕기 위해 : 제공 한 경로는 파일과 함께 저장됩니다. 파일에 액세스하면 저장된 경로가 조회되고 파일을 기준으로 확장됩니다. 링크를 만들 때 어떤 디렉토리에 있었는지 알 수 없습니다.
Marian

2
정확히 동일 :ln -s ../some/other/file /some/dir/linkname
sehe

1
대신 다시 최대 디렉토리와 추락, 당신도 바로 할 수 ln -s ./file linkname있기 때문에 .현재 디렉토리를 의미합니다.
pduersteler

1
ln -s somedir/original-dir link-name작동하지 않습니다. link-name잘못된 링크가 포함 된 이름의 디렉토리를 작성합니다 . 작동하는 명령은 다음과 같습니다ln -sr somedir/original-dir link-name
Lorenz Meyer

28

GNU coreutils의 ln (> = 8.16) 최신 버전은 --relative(또는 -r) 옵션을 지원합니다. 즉 ln -s, 작업 디렉토리와 관련하여 2 개의 절대 또는 상대 경로를 호출 할 수 있으며 올바른 상대 경로를 알아낼 것입니다 심볼릭 링크에 작성되었습니다.


2
감사. 이 -r옵션은 크로스 컴파일 할 때 빌드 호스트에서는 절대 경로가 필요하지만 대상에서는 상대 경로가 필요할 때 유용합니다.
Robert Calhoun

rdfind는 절대적 일뿐만 아니라 아무런 이유없이 디렉토리에서 역 추적되는 일부 나쁜 심볼릭 링크를 생성 할 수 있습니다. ln -r -s targetfile myalias문제 해결에 도움을 줄 수 있습니다
Ray Foss

2

이해해야 할 것은 기본적으로 심볼릭 링크는 파일을 포함하는 디렉토리 항목보다 텍스트 파일과 유사하다는 것입니다. 그래서 당신이

echo ../poo >/file/name

그때는

ln -s ../poo /file/name

시스템은 /file/../poo존재 하는지 전혀 신경 쓰지 않으며 심볼릭 링크에 넣는 텍스트 일뿐입니다. 무언가가 심볼릭 링크 를 열려고 할 때 시스템이이를 해결하려고 할 때입니다.

파일 이름이 완성 된 쉘을 사용하는 경우이 기능을 사용하면 완전히 다른 디렉토리에서 심볼릭 링크의 대상으로 사용하더라도 현재 작업 디렉토리에 상대적인 파일 이름을 완성 할 수 있으므로 혼동 될 수 있습니다.


이것은 일부 시스템 호출에 의해 남용됩니다. 예를 들어 BSD 는 특정 시스템 파일 을 심볼릭 링크 <하여 시스템이 메모리를 할당하는 방식을 변경하는 데 사용됩니다. 물론 <해당 디렉토리에 이름이 지정된 파일은 없으며 특정 플랫폼의 일반 텍스트 파일보다 매력적인 속성을 가진 매우 작은 파일과 같은 것을 만드는 저렴한 방법입니다.
tripleee

그 링크는 이제 죽었습니다. man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5를 시도해보십시오 . 그러나 최신 버전의 OpenBSD에서는 그 동작이 훨씬 덜 화려합니다.
트리플 리

0

OS X에서 상대적 링크는 까다로웠다.

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

둘 다 작동하지 않았습니다 (뭔가 생성되었지만 디렉토리가 아닙니다). 절대 경로 를 사용하여 원하는 링크를 만들었습니다 .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

실행 가능한 솔루션이므로 주석 일 필요는 없습니다. 이것은 별도의 답변으로 남을 수 있습니다.
slhck

1
상대 링크를 사용한 초기 시도는 명백히 잘못되었으므로 작동하지 않습니다. 상대 링크의 작동 방식을 이해하지 못했습니다. OS X를 사용하는 경우에도 특별히 까다로운 것은 없습니다. 아마도 링크를 만들 때 작업 디렉토리를 변경하는 것에 대한 다른 답변에 의해 잘못 인도되었을 것입니다. 링크를보다 쉽게 ​​수행 할 수 있도록하기위한 것이지, 필요하지 않습니다. 현재 디렉토리에 상대적인 상대 경로를 정의하지 않고 링크 디렉토리에 정의합니다. 이것은 당신이 ln -s Dropbox/git/codyhess/bin ~/bin
Timo

또한 누군가가 절대 링크를 할 수 있다는 말이 어떤 세상에서 상대 링크를 만드는 방법을 구체적으로 요구할 때 @slhck는 "유효한 솔루션"을 구성합니까? 구체적으로 OPs 질문에 대답하지 않으므로 솔루션과 정반대이며 솔루션이 아닙니다. 이것은 주석이나 대답이 아니어야합니다. "맥 사용자가 이해할 수 있도록 설명 된 상대 링크가 정확히 어떻게 작동합니까?"라는 질문이어야합니다. 이 맥 사용자가 이제 충분히 설명했으면 좋겠다. :)
Timo

@TimoLehto 아마도 원저자 (Cody Hess)에게 의견을 전하고 싶을 것입니다. 게시물 만 복사했습니다.
slhck

@ slhck, 나는 당신에게 해결책을 "유효한"것으로 생각하고 당신의 의견은 당신이 대답을 "답변이 아닌 것"으로 표시하고 싶다면 (그리고 신고 허용).
Timo

0

상대 경로를 사용하여 심볼릭 링크를 만드는 방법을 자세히 설명하고 싶었습니다 (자세한 예제 포함).

주석에 언급 된 Ignacio Vazquez-Abrams와 같이 현재 디렉토리가 아닌 심볼릭 링크가 생성 될 위치를 기준으로 파일 / 폴더 위치를 지정해야합니다.

당신은에 있습니다 /usr/share/nginx/html/_src/learn 당신은에 심볼릭 링크 coding를 만들 것 입니다/usr/share/nginx/html

상대 심볼릭 링크 (이론) 만들기 :

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

실제 상대 심볼릭 링크를 만듭니다.

sudo ln -s ./_src/learn/coding ../../coding

추가 정보 (같은 예)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.