심볼릭 링크를 편집하려면 어떻게해야합니까?


64

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

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


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


당신의 이해는 약간 제한되어 있습니다. 그것이 '파일'이라고 불리는 유일한 이유는 더 나은 단어가 없기 때문입니다.
Shadur

5
창 변형 인 난처한 분위기와 달리 posix 스타일의 심볼릭 링크는 파일 시스템 계층 자체에서 작동합니다. 파일 시스템을 편집하는 유일한 방법은 파일 시스템을 직접 편집하는 것입니다. 일반적으로는 그만한 가치가 없습니다.
Shadur

@Shadur .lnk 파일은 실제로는 심볼릭 링크가 아닙니다 ( Vista는 Vista 이후 적절한 심볼릭 링크 가졌습니다). 특정 폴더로 변경하거나 특정 인수 및 특정 CWD로 프로그램을 시작하는지 여부에 관계없이 명령을 실행하는 바로 가기와 같습니다.
JAB

답변:


36

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

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

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


7
그래도 여전히 편집 대신 교체를 수행하지만 원자 교체를 할 수 있습니다 (새로운 링크에는 새로운 inode 번호가 있음).
psusi

2
@psusi 나는 완전히 동의합니다. 일부 시나리오에서는 다른 답변보다 기술적으로 약간 더 나은 옵션입니다.
Oli

링크를 다른 대상으로 리디렉션하는 경우 inode 번호를 변경하면 작은 변화처럼 보입니다.
ams

4
linkname디렉토리에 대한 심볼릭 링크가 아니라고 가정합니다 . 이 -T옵션을 사용하여 mvGNU의 -h경우 또는 FreeBSD의 경우이를 피하십시오. 이와 같이 ln -sf링크의 권한이 중요한 시스템에서는 링크의 권한이 유지되지 않습니다.
Stéphane Chazelas

디렉토리의 심볼릭 링크를 변경하는 또 다른 솔루션은 다음과 -n같은 옵션 을 사용하는 것 ln -sfn DESTINATION_DIRECTORY LINK_NAME입니다. askubuntu.com/a/186227/69004
sobi3ch

22

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

$ 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()

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


9
unlink (); symlink (); 이후 이것이 "편집"으로 간주 될 수 있는지 의심 스럽다고 생각합니다. 은 원자가 아니므로 링크가 존재하지 않는 아주 작은 시간이 있습니다.
재생

@ mauro.stettler 네, 맞습니다. 그러나 이것은 귀하의 관점에 달려 있다고 생각합니다. 최종 결과 만 고려하면 다른 것으로 고려되지 않은 편집 된 것으로 간주 할 수 있습니다.
NlightNFotis

1
유닉스 시간 공유 시스템 백서에서 인용 한 섹션은 하드 링크를 설명 합니다. 이것들은 OP가 요구 한 심볼릭 링크 (심볼릭 링크)와는 완전히 다릅니다.
Ansgar Esztermann

4
test의 대상이 디렉토리가 아니라고 가정합니다 . 그렇지 않으면 해당 디렉토리에 심볼릭 링크 ln -s -f .profile test가 생성 .profile됩니다. GNU ln는이 -T를 피할 수 있는 옵션이 있습니다.
Stéphane Chazelas

9

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

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

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

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

2
mv -f(와 같은 ln -sf)는 $link디렉토리를 가리키는 경우 원하는 것을 수행하지 않습니다 . GNU ln과 mv는이를 -T위한 것입니다. mv(시스템 호출 이름 변경)은 항상 inode를 변경 $link하지만 ln -sfT(unlink + symlink)는 동일하게 재사용 할 수 있습니다.
Stéphane Chazelas

0

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

다음 은 기존 심볼릭 링크를 업데이트하기 위해 작성한 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"
}

죄송합니다. "답변"은 요청 된 질문과 원격으로 만 관련이 있습니다.
user2233709

안녕하세요 @ user2233709-사용자의 질문 " 어떻게 심볼릭 링크를 편집 할 수 있습니까? "는 첫 문장과 솔루션을 제공함으로써 명확하게 답변되었습니다. 좀 더 자세히 설명해 주시겠습니까?
blizzrdof77

2
질문을 정말로 읽었습니까? 심볼릭 링크를 교체 하지 않고 수정할 수 있는지 여부에 관한 것입니다. 제안 된“솔루션”은 심볼릭 링크 를 대체 하는 스크립트입니다 .
user2233709

0

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

 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
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.