파일을 하위 디렉터리의 새 파일에 심볼릭 링크하는 것은 하위 디렉터리를 이동하지 않고도 간단해야 할 것 같습니다. 그러나 구문에 관한 내용이 혼란스럽고 내가 예상한 것과 반대됩니다. 테스트 사례는 다음과 같습니다.
mkdir temp
cd temp
mkdir deploy
echo "Contents of the build file!" > deploy/resources.build.php
ln -s deploy/resources.build.php deploy/resources.php
cat deploy/resources.php #bad symlink
이것은 단지 깨진 심볼릭 링크를 생성할 뿐입니다! 저는 이것을 빌드 환경 설정 스크립트 내에서 실행하고 있으므로 현재 작업 디렉터리를 최대한 변경하지 않으려고 합니다.
ln -s deploy/resources.build.php resources.php
cat deploy/resources.php
또한 배포 하위 디렉터리 대신 임시 디렉터리에 심볼릭 링크를 생성하기 때문에 작동하지 않습니다.
cd deploy
ln -s resources.build.php resources.php
cd ..
이것은 작동하지만 디렉토리를 변경하지 않고 이를 수행하는 방법을 알고 싶습니다.
전체 경로를 사용하세요. 예를 들면 다음과 같습니다.
/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php
작동하지만 불편하고 다소 비실용적입니다. 특히 빌드마다 모든 프로젝트 콘텐츠가 다를 수 있는 빌드 환경에서는 더욱 그렇습니다.
새 파일 "별칭"에 새 이름을 지정하면서 하위 디렉터리 안팎으로 이동하지 않고 하위 디렉터리에 있는 두 파일 사이에 심볼릭 링크를 만들려면 어떻게 해야 합니까?
답변1
그러나 구문에 관한 내용이 혼란스럽고 내가 예상한 것과 반대됩니다.
ln
사용 중인 양식의 매개변수는 다음과 같습니다.
ln [옵션]... [-T] TARGET LINK_NAME(첫 번째 형식)
혼란스럽고 직관적이지 않은 점은 심볼릭 링크를 만들 때표적for에 대한 인수는 ln
파일 경로가 아니라 생성될 심볼릭 링크의 내용이 될 것으로 예상됩니다. 생각해보면 그럴 수밖에 없다는 것은 자명하다. 고려하다:
$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt 3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo
이 예에서는 동일한 파일을 가리키는 "bar1"과 "bar2"라는 이름의 2개의 심볼릭 링크를 만들었습니다. ls
심볼릭 링크 자체의 내용이 서로 다르다는 것을 나타냅니다. 하나는 절대 경로를 포함하고 다른 하나는 상대 경로를 포함합니다. 따라서 다른 디렉토리로 이동하더라도 하나는 계속 작동하지만 다른 하나는 작동하지 않습니다.
$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory
따라서 상대 및 절대 심볼릭 링크를 생성할 수 있어야 하고 나중에 대상 파일을 생성해도 손상되지 않는 손상된 심볼릭 링크도 생성할 수 있어야 한다는 점을 고려하면,표적인수는 기존 파일의 경로가 아닌 자유 형식 텍스트로 해석되어야 합니다.
배포/resources.build.php에 연결되는 배포/resources.php라는 파일을 생성하려면 절대 심볼릭 링크를 생성할지 여부를 결정해야 합니다(이동된 심볼릭 링크에는 복원력이 있지만 대상이 이동된 경우 ) 또는 상대 심볼릭 링크(심볼릭 링크와 대상이 함께 이동되고 동일한 상대 경로를 유지하는 한 계속 작동합니다).
절대 심볼릭 링크를 만들려면 다음을 수행하세요.
$ ln -s $PWD/deploy/resources.build.php deploy/resources.php
상대 경로를 만들려면 먼저 소스에서 대상까지의 상대 경로를 찾습니다. 이 경우 소스와 대상이 서로 동일한 디렉터리에 있으므로 다음을 수행할 수 있습니다.
$ ln -s resources.build.php deploy/resources.php
동일한 디렉토리에 있지 않은 경우 다음을 수행해야 합니다.
$ ln -s ../foo/f bar/b
이 경우 및 foo
가 모두 현재 디렉터리에 있더라도 를 bar
포함해야 합니다.../
ln
표적f
Contains 에서 가져오는 방법을 설명하기 때문입니다 b
.
ln
이것은 매우 긴 설명이지만 구문을 더 잘 이해하는 데 도움이 되기를 바랍니다.
답변2
다음과 같이 서브셸에 링크를 만들 수 있습니다.
(cd deploy && ln -s resources.build.php resources.php && cat resources.php)
서브쉘의 실행이 완료되면 여전히 올바른 디렉토리에 있음을 알 수 있습니다.
또는 시도해 볼 수도 있습니다.
ln -s resources.build.php deploy/resources.php
파일이 CL에 포함되어 있다는 사실을 무시하고 이 방법도 작동합니다.리소스.빌드.php명령을 실행한 디렉토리가 아니라 실제로 내부에 있습니다.. /배포.
답변3
나는 심볼릭 링크가 기본적으로 구성 파일이라는 것을 깨달을 때까지 이것이 나를 혼란스럽게 했습니다. 즉, 해당 경로 데이터를 간단한 텍스트 파일에 어떻게 쓰나요?
ln -s [target] [link name]
이 되다:
echo [target] > [link name]
내가 (아마도 OP도) 저지른 실수는 다음과 같습니다.왜냐하면대상 파일을 알아야 합니다.왜냐하면신경쓰지 마세요. 단지 파일에 일부 경로 정보를 기록합니다. 이것은 완전히 합리적인왜냐하면주문하다:
ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err
그러므로:
ln -s deploy/resources.build.php deploy/resources.php
resources.php
해당 폴더의 ./deploy
파일을 참조하는 resources.build.php
폴더에서 호출되는 simlink 파일을 생성합니다 ./deploy/deploy/
.
이것은 당신이 원하는 것이 아닐 것이며, 잘못된(깨진) 링크를 제공할 것입니다. 링크에는 문제가 없습니다. 파일을 거기에 넣으면 링크가 작동합니다. 그러나 (다른 사람들이 지적했듯이) OP와 내가 원하는 것은 다음과 같습니다.
ln -s resources.build.php deploy/resources.php
답변4
최근에이 문제가 발생했습니다. 기억하세요. 이것은 source
입니다 target
.
❯ ln -s source target
descriptor
그렇기 때문에 소스(AKA )가 나타나는 대로 이해할 수 있도록 소스에서 절대 경로를 사용하거나 현재 디렉터리를 최종 대상 디렉터리로 변경해야 할 수 있습니다 .
예: 소스를 a
대상에 연결합니다 b
.
root
├── foo
│ └── a
└── bar
❯ pwd
root
❯ ln -s ../foo/a ./bar/b
이 예에서 파일 설명 b
은 입니다 ../foo/a
. 따라서 나는 file 이므로 다음을 b
수행해야 합니다.
- 한 수준 위로 디렉터리가
bar
. - 로 변경
foo
. - 찾다
a
.
root
├── foo
│ └── a
└── bar
└── b -> ../foo/a