심볼릭 링크에 대한 나의 기본 이해는 다른 파일에 대한 문자열 경로를 포함하는 파일 인 특수 파일입니다. 커널의 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