심볼릭 링크를 재정의 / 업데이트하는 방법?


188

심볼릭 링크를 사용하려고합니다. 나는 약간의 독서를하고 다음 명령을 발견했다.

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

작성 및 삭제가 정상적으로 작동합니다. 그러나 업데이트가 작동하지 않습니다. 이 명령을 수행 한 후 symlink는 유효하지 않습니다.

여기저기서 심볼릭 링크를 업데이트 / 재정의 할 수 없다는 것을 읽었습니다. 인터넷에는 모순되는 정보가 있습니다. 누구가 옳습니까? 심볼릭 링크를 업데이트 / 재정의 할 수있는 경우 어떻게해야합니까?

최신 정보

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

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

에서 ~/scripts/test/수행 할 때 :

ln -s /remote_loc/site1 test_link

a test_link가 만들어지고 할 ls -l수는 있지만 깨진 것 같습니다 (내 질문에서 위에서 말한 것과 반대로).

다중 디렉토리 레벨 링크를 수행하려면 어떻게해야합니까?


1
unlink대신에 사용 하는 것이 좋습니다 rm. 함께 unlink사용하면 실수로 잘못된 스위치를 사용하여 소스 디렉토리의 모든 파일을 잃을 위험을 감수하지 않습니다.
Jpsy

당신은 명령에 선행 /를 사용하고 있습니다
Jamie Cook

@jpsy 링크 해제에 대한 조언 은 사실이라면 매우 좋습니다 . zzzz를 터치하십시오. zzzz를 연결 해제하십시오. (통화 연결 해제, rm과 동일한 연결 해제, 고급 옵션 및 재귀 없음).
ctrl-alt-delor

왜 사용 -n합니까? (문제 일 수 있음). 또한 귀하의 지원이 지원 -t하는 경우, 이러한 경우 및 -T/ 또는 destination/다른 경우에 사용하십시오.
ctrl-alt-delor

답변:


150

-fwith ln를 사용하면 이미 존재하는 링크를 덮어 쓸 수 있습니다. 올바른 권한이 있으면 작동해야합니다 ... 항상 나를 위해 일했습니다. 어떤 운영 체제를 사용하고 있습니까?


내 문제에 대한 자세한 정보로 질문을 업데이트했습니다.
Jérôme Verstrynge

나는 리눅스 아래에 있습니다.
Jérôme Verstrynge

2
ln매개 변수 를 전환하면 스위치가 -f기존 파일 (링크 대상)을 파괴합니까? 두 경우 모두 -i약간의 보안을 원할 경우 매개 변수 (사용자에게 덮어 쓰기를 요구하는 프롬프트)도 있습니다.
palswim

2
@palswim이 SO 포스트가 있기 때문에 안전합니다 의미 -f단지 호출 unlink()link(): 후드 stackoverflow.com/a/1466570/157385 . 그래도 올바른 순서를 기억하고 싶습니다!
Mike Branski

4
작동하지 않습니다. 필요 -n합니다. 허용 된 답변을 참조하십시오.
숀 웰치

119

좋아, 나는 내 오류가 어디에 있는지 발견 /했다.

다시 말해, 내 질문에있는 명령은 다음과 같아야합니다.

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

대신에

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

내 사건을 고려합니다.


22
그 이유에 대한 추가 정보의 경우 차이점은 하나는 relative경로 ( 앞에 /가없는)이고 다른 하나는 경로 ( 앞에 /가있는 absolute)입니다. Linux 시스템을 관리하는 경우 차이점을 이해하는 것이 중요합니다. 예를 들어, 직업을 유지할 것인지 아닌지를 결정 하는 차이점은 다음 rm -rf ./*rm -rf /.*
같습니다.)

5
이것은 'sym 링크를 업데이트 /
오버

ln -sfn {path / to / file-name} {link-name} 행이 수행합니다.
Jérôme Verstrynge

6
-n (-no-dereference)은 {link name}을 링크를 따르는 것이 아니라 일반 파일처럼 취급합니다. 해당 링크를 따라 가지 않으면 서이 옵션을 사용해야합니다.
feldoh

1
이 답변은 -n심볼 링크를 대체하기위한 매개 변수 가 포함 된 주요 답변이어야합니다 .
Nick Tsai

12

첫 번째 문제:

당신을 인용 :

작성 및 삭제가 정상적으로 작동합니다. 그러나 업데이트가 작동하지 않습니다. 이 명령을 수행 한 후 symlink는 유효하지 않습니다.

주어진 디렉토리 구조의 문제점 :

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / stuff1.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

그리고 명령을 사용하여 :

ln -s /remote_loc/site1 test_link

/ remote_loc / site1의 / 또는 루트에 존재하지 않는 파일을 가리키는 $ PWD 또는 현재 작업 디렉토리에 기호 링크를 작성한다는 것입니다.

PWD가 ~ / scripts /에 있다면 다음을 사용해야합니다.

ln -s remote_loc/site1 test_link

그렇지 않으면 다음과 같은 전체 절대 경로를 사용할 수 있습니다.

ln -s /home/yourusername/remote_loc/site1 test_link

두 번째 문제 :

당신을 인용 :

여기저기서 심볼릭 링크를 업데이트 / 재정의 할 수 없다는 것을 읽었습니다. 인터넷에는 모순되는 정보가 있습니다. 누구가 옳습니까? 심볼릭 링크를 업데이트 / 재정의 할 수있는 경우 어떻게해야합니까?

"누가 옳은가"라는 질문에 대답하기 위해 정확히 무엇을 읽었는지 또는 어떻게 이해했는지 잘 모르겠습니다. 그러나 다음은 정리하는 데 도움이됩니다.

  1. 무엇을 업데이트 할 수 있습니까?
  2. 적절한 스위치를 사용하지 않고 업데이트 할 수없는 것.


디렉토리가 아닌 대상으로 기호 링크 업데이트

ln -sf :
-f 또는 --force는 기존 대상 파일을 제거합니다. 이는 링크의 대상 또는 대상을 업데이트하는 데 사용됩니다.

예:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

그러나 보시다시피 절대 경로가 ln인수 에 있으면 절대 경로를 제공합니다 . 현재 작업 디렉토리가 링크의 상위 디렉토리와 다른 경우 전체 경로를 제공해야합니다.


상대 경로 :

ln -sfr :
-r 또는 --relative는 링크 위치에 상대적인 심볼릭 링크를 만듭니다.

예:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

그러나 대상이 디렉토리 인 경우 디렉토리에 대한 링크를 업데이트 할 수 없습니다.

예:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

보다시피 ln, -r 옵션없이 위의 인수에 주어진 절대 경로 이름을 사용하더라도 심볼릭 링크는 여전히 링크에 상대적입니다.


디렉토리에 대한 링크 업데이트 :

ln -sfrn :
-n 또는 --no-dereference는 LINK_NAME이 디렉토리에 대한 심볼릭 링크 인 경우 일반 파일로 취급합니다.

예:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

대조적으로 :

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

1 레벨의 디렉토리로 테스트를 수행하면 작동하지만 다중 레벨 디렉토리를 사용하려고하는데 작동하지 않습니다. 내 질문을 업데이트했습니다.
Jérôme Verstrynge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.