디렉토리를 가리키는 심볼릭 링크를 만드는 데 사용할 수있는 pot 등원 명령은 무엇입니까?

디렉토리에 대한 심볼릭 링크를 생성하는 쉘 스크립트에 명령을 넣고 싶지만이 스크립트는 계속 실행될 수 있으므로 후속 호출에서 명령은 아무것도 변경해서는 안됩니다.

디렉토리 구조는 다음과 같습니다.

% tree /tmp/test_symlink 
/tmp/test_symlink
├── foo
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

foo/디렉토리를 가리키는 스 니펫이라는 심볼릭 링크를 만들고 싶습니다 /tmp/test_symlink/repo/resources/snippets.
그래서 나는 달린다.

% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets'

원하는 결과를 제공합니다.

% tree /tmp/test_symlink                                                          
/tmp/test_symlink
├── foo
   └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

5 개 디렉토리, 5 개 파일

그러나 명령을 다시 실행하면

% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets/snippets' -> '/tmp/test_symlink/repo/resources/snippets'

디렉토리에 대한 심볼릭 링크를 생성하고 심볼릭 링크가 존재하는 곳에서 심볼릭 링크를 실제 디렉토리에 넣습니다.

% tree /tmp/test_symlink                                                          
/tmp/test_symlink
├── foo
   └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets -> /tmp/test_symlink/repo/resources/snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

왜 이런 일이 발생하고 후속 호출로 인해이 이상한 효과가 발생하지 않도록 명령을 수정하려면 어떻게해야합니까?



답변

-T이 옵션을 사용해야합니다. ln항상 링크 이름을 원하는 링크 이름으로 취급하고 디렉토리로 취급하지 않도록 지시 합니다.

이 옵션을 사용하지 않으면 ln디렉토리로 존재하는 링크 이름을 지정하면 해당 디렉토리 내의 대상에 대한 새 링크가 작성됩니다.

-T(적어도, 그것은 POSIX에없는)은 GNU-주의이지만, 이미 사용하고 -v내가 그 문제가되지 상상 있도록 GNU-주의도이다.

또는 부모 디렉토리를 링크 이름으로 지정하면 링크가 항상 (재) 생성됩니다.

ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/

심볼릭 링크가 대상과 이름이 같기 때문에 작동합니다.


답변

여기서 일어나는 일을 가장 잘 말할 수있는 것은 두 번째 단계에서 ln명령이 cp또는 처럼 작동 mv한다는 것입니다. 존재하는 경우 <대상>을 만듭니다. (이것은 “슬래쉬 닷”트릭이 피하는 것입니다. 즉, <destination>이 존재하고 디렉토리인지 확인합니다).
그러나 나는 틀릴 수 있습니다.

두 경우 모두 작동하는 것 같습니다

ln -sfv --no-dereference /tmp/test_symlink/repo/resources/snippets/ foo/snippets


답변