상대 경로 이름에 대한 심볼릭 링크 만들기


64

나는 이것을 할 수있다 :

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

그러나 나는 이것을 할 수 있기를 원합니다.

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

이게 가능해? 어떻게 든 상대 경로 이름을 확인하고 전달할 수 ln있습니까?


그러나 설명 된 동작으로 해결할 수있는 문제는 무엇입니까?
forcefsck

다운로드 용 압축 폴더를 제공하고 일부 폴더 파일을 심볼릭 링크하는 방법에 대한 복사 가능 명령을 제공한다고 가정 해보십시오.
Humphrey Bogart

2
ln -s $(pwd)/bar.txt ~/또는 설치 스크립트를 포함하십시오.
forcefsck

2
링크는 실제로 명령 행에서 사용하는 이름을 저장합니다. 해당 이름을 파일로 확인하는 것은 링크 위치를 기준으로 수행됩니다. ln -s foo/bar.txt /home/beau/bar.txt
pqnet

답변:


62

상대 경로에 대한 심볼릭 링크를 만들면 예제에 표시된 것처럼 절대적이 아닌 상대 심볼릭 링크로 저장됩니다. 이것은 일반적으로 좋은 것입니다. 파일 시스템이 다른 곳에 마운트 된 경우 절대 기호 링크가 작동하지 않습니다.

예제가 작동하지 않는 이유 ln는 실행 위치 가 아니라 기호 링크의 상위 디렉토리에 상대적이기 때문 입니다.

넌 할 수있어:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

또는 그 문제에 대해 :

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

첫 번째 인수 이후 ln -s의 심볼은 심볼릭 링크의 대상으로 저장됩니다. 임의의 문자열이 될 수 있지만 (비어있을 수없고 NUL 문자를 포함 할 수없는 유일한 제한 사항이 있음), 심볼릭 링크를 사용하고 확인할 때 해당 문자열은 symlink의 상위 디렉토리 (로 시작하지 않을 때 /).


2
멋지게 말했다. 내가 직접 답을 입력하는 동안이 질문에 대답했습니다. :)
Shadur

방금 약간 다른 질문이 있었는데 완벽하게 대답합니다. symlink에서 홈 디렉토리를 참조하는 방법을 알고 싶었으므로 한 사용자에서 다른 사용자로 디렉토리를 전송할 때 작동합니다. 같은 ~것이 효과가 있는지 확실하지 않았습니다 .
Joe

"그 문자열은 symlink의 상위 디렉토리에 대한 상대 경로로 이해됩니다"-이것은 모든 것을 설명합니다!
Bojan Komazec

24

최신 coreutils (coreutils-8.22-11을 사용하고 있음)를 사용하는 경우 다음과 같은 옵션이 있습니다.

ln --help | grep relative

임의의 텍스트를 보유 할 수 있습니다. 나중에 해결되면 상대 링크는 -r입니다.-상대 링크 위치와 관련된 심볼릭 링크를 만듭니다.

예를 들면 다음과 같습니다.

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from

흠, 나에게는 그런 옵션이없는 것 같습니다 -r. 그래도 Mac을 사용합니다.
ivkremer

1
@ivkremer는이 옵션이 있기 때문에 가능한 것 같다 coreutils(출처 :> = 8.16 superuser.com/a/837935/403979 )
DJCrashdummy

상대 플래그를 사용하면 내가 경험 한 "너무 많은 수준의 심볼릭 링크"문제가 해결 된 것 같습니다.
Vix

12

죄송합니다 심볼릭 링크는 링크를 만들 때 있었던 위치가 아니라 링크가있는 위치를 기준으로합니다. 이 동작에는 몇 가지 이유가 있으며 대부분 원격 파일 시스템 마운트와 관련이 있습니다.


7

symlinks많은 Linux 배포판에 있는 편리한 작은 유틸리티 (원래 Mark Lords, 현재 J. Brandt Buckley가 유지 관리)가 있습니다.

디렉토리의 모든 절대 기호 링크를 상대 링크로 변환하려면 다음을 수행하십시오.

symlinks -c /path/to/directory

불행히도 단일 링크를 변환 할 수있는 옵션이 없으므로 먼저 해당 링크를 자체 디렉토리로 이동해야합니다.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

감사. github에서 사용 가능한 심볼릭 링크 . J. Brandt Buckley가 관리합니다. v1.4.3 .
Evgeny Vereshchagin

3

시도해 볼 수 있습니다 :

ln -s `pwd`/bar.txt /home/beau/bar.txt

그러나 절대 경로 이름에 대한 심볼릭 링크를 만듭니다. 텍스트 질문에 상대 경로 이름이 언급되어 있습니다 ...

일반적으로 상대 경로 이름은 원하는 것과 ln -s제공하는 것입니다. 나는 당신이 원하는 것이 있다고 생각합니다.

cd /home/beau
ln -s foo/bar.txt bar.txt

1

가장 일반적인 쉘이 경로를 확장함에 따라 상대 심볼릭 링크를 만들려면 "소스 경로"를 인용해야합니다.

또한 -s매개 변수는를 의미 --symbolic합니다. ln기본적으로 하드 링크를 만듭니다.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path

0

마운트 포인트가 변경 될 가능성이없는 경우 다음과 같이 bash 쉘에서 수행하려는 작업을 수행 할 수 있습니다.

ln -s `pwd`/bar.txt ~/bar.txt

이는 심볼릭 링크를 만들 때 대상 디렉토리에 있다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.