심볼릭 링크를 편집하려면 어떻게해야합니까? 부분을 추상화하지만 심볼릭 링크를 편집 할 수없는

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

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


나는 심볼릭 링크 를 대체 하는 다양한 방법이 있지만 (두 가지 대안이 현재 답변 섹션에 있음) 이해하지만 대체가 심볼릭 링크를 다루는 유일한 방법 인 이유에 대한 설명을 얻는 것이 흥미로울 것입니다. 왜 그들이 가리키는 위치를 변경할 수 없습니까?



답변

점을 감안 -f단지, 당신은 자동 교체 않습니다 와 원자 대체 할 수있는 mv -T(-T 그것이 /loc…/link 디렉토리 인 경우에도 작동한다)를 :

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

linkname 프로세스 전체에서 액세스 할 수 있습니다.


답변

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

$ 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매개 변수 ( --force)가 호출을 발생 ln를 전달하는 경우 unlink()직전 시스템 호출을symlink()

다음 스택 오버플로 응답 에서 가져 왔습니다 .


답변

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

symlink시스템 호출은 새로운 심볼릭 링크를 생성, 그것은 기존의 파일을 제거하지 않습니다. 이것은 성가신 일이지만 open(새 파일을 만들거나 기존 파일을자를 수는 있지만 기존 파일을 새로 만든 파일로 대체 할 수는 없음) 및과 같은 파일을 만들기위한 다른 시스템 호출과 일치 합니다 mkdir.

쉘에서 발견 한 것처럼 기호 링크를 ln명령 으로 원자 적으로 바꿀 수는 없지만 ( ln -sf이전 파일의 링크를 해제 한 다음 기호 링크를 작성 함) 먼저 임시 이름으로 기호 링크를 작성하여이를 수행 할 수 있습니다. 그런 다음 제자리로 옮기십시오.

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


답변

기술적으로 기존 심볼릭 링크를 편집하기위한 기본 제공 명령이 없습니다. 몇 가지 짧은 명령으로 쉽게 달성 할 수 있습니다.

다음 은 기존 심볼릭 링크를 업데이트하기 위해 작성한 bash / zsh 함수입니다 .

# -----------------------------------------
# Edit an existing symbolic link
#
# @1 = Name of symbolic link to edit
# @2 = Full destination path to update existing symlink with
# -----------------------------------------
function edit-symlink () {
    if [ -z "$1" ]; then
        echo "Name of symbolic link you would like to edit:"
        read LINK
    else
        LINK="$1"
    fi
    LINKTMP="$LINK-tmp"
    if [ -z "$2" ]; then
        echo "Full destination path to update existing symlink with:"
        read DEST
    else
        DEST="$2"
    fi
    ln -s $DEST $LINKTMP
    rm $LINK
    mv $LINKTMP $LINK
    printf "Updated $LINK to point to new destination -> $DEST"
}


답변

과거에 링크 결과가 있다고 가정합니다.

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

그런 다음 심볼릭 링크를 변경하는 세 가지 방법이 있습니다.

  • ln을 -f강제로 사용 하거나 디렉토리에도 사용하십시오 -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
    

답변