너무 많은 수준의 심볼릭 링크


100

이 파일 구조를 만들었습니다.

test/src
test/firefox

이 명령을 실행할 때 :

ln -s test/src test/firefox

나는 심볼릭 링크가 기대 test/firefox/src를 가리키는 만들 수 test/src있지만 내가 대신이 오류를 얻을 :

-bash: cd: src: Too many levels of symbolic links
  • 내가 무엇을 잘못하고 있지?
  • 해당 폴더의 형제에 저장된 하나의 폴더에 대한 심볼릭 링크를 만들 수 없습니까?
  • 요점이 뭐야?

당신이 한 일을 잘 모르겠습니다. 의 출력 ls -ld test test/*또는 이러한 파일을 만들기 위해 실행 한 명령의 정확한 순서를 게시하십시오 .
Gilles

mkdir 테스트; mkdir 테스트 / src; mkdir 테스트 / 파이어 폭스; ln -s 테스트 / src 테스트 / firefox
David Zorychta

이 명령을 사용하면 매달려있는 심볼릭 링크 이므로 cd test/firefox/srcerror가 표시 됩니다. ? 라는 다른 심볼릭 링크에서 실행 중 입니까? cd: no such file or directory: test/firefox/srctest/firefox/srccdsrc
Gilles

난 당신이 사이에 뭔가했다 확신 ln -s하고 cd당신이 우리를 말하지 않는합니다. test현재 디렉토리에 서브 디렉토리 만 있다고 가정하면 cd src(또는 실행 한 것) 오류가 발생합니다. 뭔가 넣었 어 test/firefox?
Dubu

5
그리고 @Gilles가 힌트를 준 것처럼, 그 링크는 당신이 생각하는 것을하지 않을 것입니다. 상대 대상이있는 심볼릭 링크 는 항상 링크 를 만든 디렉토리가 아니라 symlink 디렉토리에 상대적 입니다. 그래서, 디렉토리에있는 /some/path, a는 ln -s test/src test/firefox에서 가리키는 심볼릭 링크 생성됩니다 /some/path/test/firefox/src에를 /some/path/test/firefox/test/src, 하지/some/path/test/src.
Dubu

답변:


32

표면적으로, 당신이 제안한 것은 저에게 효과적입니다.

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

심볼릭 링크를 만드십시오.

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

두 번째로 실행하면 일반적으로 다음이 생성됩니다.

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

그래서 여기에 다른 일이있을 것입니다. 링크가 자신을 다시 가리키는 순환 참조가 있다고 생각합니다.

당신은 find이것을 조금 깨우는 데 사용할 수 있습니다 :

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15범인을 공개 함
user7610

167

Dubu가 의견에서 지적한 것처럼, 문제는 상대 경로에 있습니다. 내 nginx 구성을에서 (으) /usr/local/etc/nginx로 연결 하는 데 비슷한 문제 가 /etc/nginx있습니다. 다음과 같이 symlink를 작성하면 :

cd /usr/local/etc
ln -s nginx/ /etc/nginx

소스 경로는 링크 경로와 관련이 있기 때문에 실제로 / etc / nginx-> / etc / nginx 링크를 작성하게됩니다. 솔루션은 절대 경로를 사용하는 것만 큼 간단합니다.

ln -s /usr/local/etc/nginx /etc/nginx

57
이 답변은 다른 답변보다 명확했습니다. "절대 경로를 사용하십시오."
wulftone

1
을 사용하여 Windows에서 이것이 효과가 있음을 확인할 수 있습니다 cygwin. 감사!
dimiguel

나는 종종 논쟁을 올바르게하는 데 문제가있다. OSX와 GNU Linux에서는 그것들을 뒤집어서 혼란스럽게 만듭니다.
Daniel W.

나는 아직도 이것이 효과가 있다고 믿을 수 없다.
PNDA

5
상대 링크 를 사용할 수 있지만 심볼릭 링크가있는 디렉토리를 기반으로 해야합니다 . 즉, 첫 번째 인수는 심볼릭 링크 파일이있는 디렉토리에서 대상 디렉토리로 이동하려는 경우 작성한 것과 동일cd 해야합니다 .
totymedli

9

심볼릭 링크는 ln프로세스 의 현재 디렉토리가 아닌 링크의 상위 디렉토리를 기준으로합니다 .

할 때 :

cd /top/dir
ln -s test/src test/firefox

( test/firefox디렉토리가있는 곳 ) test/firefox/src타겟이 인 심볼릭 링크를 만들고 test/src있습니다.

test/src받는 상대적인 test/firefox디렉토리, 그래서에 대한 심볼릭 링크입니다 /top/dir/test/firefox/test/src.

해당 symlink가에 대한 링크가되도록 /top/dir/test/src하려면 다음을 작성해야합니다.

ln -s ../src test/firefox/

또는

ln -s /top/dir/test/src test/firefox/

디렉토리의 이름이 변경되거나 파일 시스템이 다른 곳에 마운트 될 때 쉽게 끊어지기 때문에 절대 경로에 대한 심볼릭 링크를 만드는 것은 일반적으로 좋지 않습니다.

GNU ln를 사용하면 -r옵션을 사용하여 자체적으로 계산할 수 있습니다.

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

상대 경로 대신 절대 경로를 사용하면 작동합니다.

예 :

ln -s /home/user/test/src /home/user/test/firefox

0

답은 절대 경로를 사용하는 것입니다. 그러나 현재 디렉토리에있는 무언가의 전체 경로를 입력하는 것은 성 가실 수 있습니다. 이를 피하기 위해 pwd의 명령 대체를 사용할 수 있습니다. 대상이 현재 디렉토리에있는 경우 :

ln -s "$(pwd)"/target abs/path/to/link 

링크가 현재 디렉토리에 있어야하는 경우 :

ln -s /abs/path/to/target "$(pwd)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.