현재 디렉토리를 변경하지 않고 서브 디렉토리의 Symlink 별명 파일


11

서브 디렉토리를 이동하지 않고 하나의 파일을 서브 디렉토리의 새 파일에 심볼릭 링크하는 것이 간단해야합니다. 그러나 구문에 대한 무언가는 당황하고 내가 기대하는 것에 반합니다. 테스트 사례는 다음과 같습니다.

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

deploy 하위 디렉토리 대신 temp 디렉토리에 symlink를 작성하기 때문에 작동하지 않습니다.

cd deploy
ln -s resources.build.php resources.php
cd ..

이것은 작동하지만 디렉토리를 변경하지 않고 수행하는 방법을 알고 싶습니다.

다음과 같은 전체 경로를 사용하십시오.

/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php

효과는 있지만, 특히 프로젝트마다 모든 프로젝트 내용이 다를 수있는 빌드 환경에서 부적절하고 다소 비실용적입니다.

하위 디렉토리로 이동하거나 하위 디렉토리로 이동하지 않고 새 파일에 "별칭"이라는 새 이름을 지정하지 않고 하위 디렉토리의 두 파일간에 심볼릭 링크를 만들려면 어떻게해야합니까?

답변:


10

그러나 구문에 대한 무언가는 당황하고 내가 기대하는 것에 반합니다.

에 대한 인수 ln는 사용중인 형식으로 다음과 같습니다.

[OPTION] ... [-T] TARGET LINK_NAME (첫 번째 형식)

당황스럽고 직관적이지 않은 것은 심볼릭 링크를 만들 때 대상 인수 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

따라서 상대 및 절대 심볼릭 링크를 모두 만들 수 있어야하고 대상 파일을 나중에 만들면 끊어지지 않는 깨진 심볼릭 링크를 만들 수 있다는 점을 고려할 때 대상 인수는 이미 존재하는 파일의 경로.

deploy / resources.build.php에 연결되는 deploy / 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

이 경우, 비록 foobar현재 디렉토리 모두, 당신은을 포함 할 필요가있다 ../ln 대상 이 찾는 방법을 설명하기 때문에 f이 들어있는 디렉토리에서 b.

매우 긴 설명이지만 ln구문을 조금 더 잘 이해하는 데 도움이되기를 바랍니다 .


3

다음과 같이 서브 쉘에 링크를 작성할 수 있습니다.

  (cd deploy && ln -s resources.build.php resources.php && cat resources.php)

서브 쉘이 실행을 마치면 여전히 올바른 디렉토리에 있습니다.

또는 시도해 볼 수 있습니다

 ln -s resources.build.php deploy/resources.php

또한 resources.build.php 파일 이 명령을 내리는 디렉토리에는 없지만 실제로는 ./deploy 안에 있다는 사실을 CL에 포함 시키지는 않습니다 .


이것은 흑 마법입니다!
Kzqai

1

symlink가 기본적으로 구성 파일이라는 것을 알기 전까지는 혼란 스러웠습니다. 즉, 어떻게 경로 데이터를 간단한 텍스트 파일로 작성합니까?

ln -s [target] [link name]

된다 :

echo [target] > [link name]

I (아마도 OP)를 만드는 것을 오류는 생각에 LN의 가 목표로 파일에 대해 알고 있어야합니다. LN은 상관하지 않는다. 그냥 경로 정보를 파일에 쓰는 것입니다. 이것은 완벽하게 합리적인 ln 명령입니다.

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에서 호출 된 simlink 파일을 생성 합니다 ../deployresources.build.php./deploy/deploy/

그것은 당신이 원하는 것 같지 않으며 나쁜 (깨진) 링크를 제공합니다. 링크에 아무런 문제가 없습니다. 파일을 거기에 넣으면 링크가 작동합니다. 그러나 (다른 사람들이 지적한대로) 나와 OP가 원하는 것은 다음과 같습니다.

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