심볼릭 링크를 편집하는 방법은 무엇입니까?

심볼릭 링크를 편집하는 방법은 무엇입니까?

기호 링크에 대한 나의 기본적인 이해는 그것이 다른 파일에 대한 문자열 경로를 포함하는 특수 파일이라는 것입니다. 커널의 VFS는 많은 것을 추상화하지만 심볼릭 링크를 편집할 수 없는 것처럼 보이는 이유가 있습니까?

즉, 심볼릭 링크를 편집할 수 있습니까? 그렇지 않다면 왜 안 됩니까?


여러 가지 방법이 있다는 것을 이해합니다바꾸다기호 링크(현재 답변 섹션에 두 가지 대안이 있음) 그러나 대체가 기호 링크를 처리하는 유일한 방법인 것처럼 보이는 이유에 대한 설명을 듣는 것은 흥미로울 것입니다. 왜 그들이 가리키는 곳을 변경할 수 없습니까?

답변1

이것이 -f단지 자동 교체를 수행하는 것이라는 점을 고려하면원자 교체가 가능합니다 mv -T(/loc.../link가 디렉토리인 경우에도 -T가 작동함).:

ln -s /location/to/link linkname
# ... 
ln -s /location/to/link2 newlink
mv -T newlink linkname

linkname프로세스 전반에 걸쳐 액세스할 수 있습니다.

답변2

편집이란 가리키는 파일을 변경하는 것을 의미하는 경우 다음을 수행할 수 있습니다.

$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile

인수 -f( )를 ln에 전달하면 이전 시스템 호출을 --force호출하게 됩니다.unlink()symlink()

에서 발췌스택 오버플로 답변.

답변3

심볼릭 링크는 원자적으로 수정되어야 합니다. 중간에 쓰면 작동하지 않습니다. 심볼릭 링크의 내용은 매우 작으므로(Linux의 경우 최대 4095자: 파일 경로의 최대 길이) 커널 수준에서 심볼릭 링크의 일부를 편집하는 것은 거의 의미가 없습니다. 따라서 커널은 심볼릭 링크를 편집하기 위한 인터페이스를 제공하지 않고 새 심볼릭 링크를 생성하기 위한 인터페이스, 시스템 symlink호출(및 파일 삭제를 위한 일반 인터페이스 unlink)만 제공합니다.

시스템 symlink호출은 새로운 심볼릭 링크만 생성하며 기존 파일은 삭제하지 않습니다. 이는 성가신 일 open이지만 (새 파일을 만들거나 기존 파일을 자를 수 있지만 기존 파일을 새로 만든 파일로 바꿀 수는 없음) 및 와 같은 파일을 만드는 다른 시스템 호출과 일치합니다 mkdir.

껍질에서는당신은 알아냈어요ln, 이 명령을 사용하여 심볼릭 링크를 자동으로 바꿀 수는 없지만 ( ln -sf이전 파일의 링크를 해제한 다음 심볼릭 링크 만들기) 먼저 임시 이름으로 심볼릭 링크를 만든 다음 제자리로 이동하면 됩니다.

tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"

답변4

완료(과거)의 결과로 링크 이름이 존재한다고 가정합니다.

 ln -s   /the/path/to/a/file   linkname

그러면 다음 세 가지 방법으로 기호 링크를 변경할 수 있습니다.

  • -f디렉토리에 대해서도 ln 을 강제로 사용합니다 -n(inode는 재사용 가능).

    ln -sfn /some/new/path linkname
    
  • 심볼릭 링크를 삭제하고 새 링크를 만듭니다(디렉토리의 경우에도).

    rm linkname; ln -s /some/new/path linkname
    
  • 새 심볼릭 링크를 생성하면 mv변경됩니다(디렉터리의 경우에도 원자적으로).

    ln -s  /some/new/path newlinkname
    mv -fT newlinkname linkname             # linkname remains after the command
    

관련 정보