ln -s를 사용하려면 특정 디렉토리에 있어야 합니까?

ln -s를 사용하려면 특정 디렉토리에 있어야 합니까?

파일에 대한 간단한 심볼릭 링크를 만들고 싶습니다.

심볼릭 링크를 생성하려는 디렉터리 내부에서 명령을 실행하면 완벽하게 작동합니다.

/path/to/link $ ln -s /path/to/file .

하지만 다른 디렉토리에 있으면 매번 끊어진 링크가 생성됩니다.

/any/other/path $ ln -s /path/to/file /path/to/link

ln -s특정 디렉토리에 있어야 합니까, 아니면 뭔가 빠졌습니까 ? 우분투 10.04를 실행 중입니다.

업데이트:경로가 상대 경로인지 절대 경로인지 혼란을 드려 죄송합니다. 그들은 상대적이었고 답변에서 여러 사람이 언급했듯이 이것이 내 문제의 원인이었습니다. 감사해요!

답변1

대상과 동일한 디렉터리에 있지 않은 경우 절대 경로를 사용해야 합니다.

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds

답변2

나는 사용하는 편이다

ln -s $(pwd)/local_file /path/to/link

로컬 파일을 연결해야 할 때.

답변3

이것은 나에게 항상 직관적이지 않습니다. 나는 습관적으로 다음을 수행합니다.

ln -s $(readlink -f /path/to/file) /path/to/link

작동해야 하지만 실제 디스크 링크에서 상대적이지 않게 만드는 비용이 듭니다.

답변4

실제로 당신이 어느 디렉토리에 있는지에 관한 것은 아닙니다. 그것은 당신이 만드는 심볼릭 링크에 관한 것입니다. 심볼릭 링크는 파일을 가리키는 경로를 포함하는 파일일 뿐입니다. 해당 문자로 시작하는 경로가 포함된 심볼릭 링크 /나 해당 문자로 시작하지 않는 심볼릭 링크를 만들 수 있습니다. 경로 구성 요소를 포함하는 심볼릭 링크 ..와 그렇지 않은 심볼릭 링크를 생성할 수 있습니다. 프로그램이 대상 파일을 찾기 위해 심볼릭 링크를 해석할 때 경로는 심볼릭 링크가 포함된 디렉터리에 상대적인 것으로 해석됩니다. 따라서 심볼릭 링크에 원하는 경로가 있는지 확인하면 됩니다.

Matthew Flaschen의 답변과 유사한 한 가지 방법이 있지만 여기서는상대적인심볼릭 링크:

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

순수한 Bourne/bash 쉘에서도 이 작업을 수행할 수 있다는 것은 의심의 여지가 없지만 Python에서는 이를 올바르게 작성하고 읽는 것이 쉽습니다.

관련 정보