심볼릭 링크를 제거하고 이를 다른 항목에 연결하고 싶습니다. 이를 수행하는 방법에는 3가지가 있습니다.
ln -sfn source dest
rm dest
ln -s source dest
unlink dest
ln -s source dest
세 가지 모두 동일합니까? 하나를 다른 것보다 선호해야 합니까?
답변1
그것들은 동일하지 않습니다.
존재하다:
ln -sfn source dest
대상을 역참조하지 않는 옵션은 -n
비표준 확장입니다( ln
1994년 버전 3.10에 추가된 GNU의 확장이라고 생각합니다). 일부는 동일한 기능(1997년 이후 NetBSD와 같은)을 ln
갖고 있고 , Solaris/Illumos와 같은 일부는 추가 기능(GNU 이전 ) 을 가지고 있습니다 .-h
-n
ln
-n
GNU 동작을 가정 -n
하면 dest
디렉토리로 존재하는 경우 dest/source
파일 자체가 디렉토리가 아닌 한 동일한 이름의 파일(있는 경우)을 대체하기 위해 파일이 생성됩니다.
dest
그렇지 않으면 기존 파일을 대체하기 위해 심볼릭 링크가 생성됩니다(있는 경우) source
.
ln
이동/복사/링크할 수 있는 짜증나고 모호한 인터페이스를 좋아하거나 cp
갖고 있습니다.mv
도착하다목적지 또는입력하다하지만 이는 사용자가 원하는 것이 아니라 마지막 인수의 유형(또는 인수 수)에 따라 달라집니다.
존재하다:
rm dest
ln -s source dest
rm
dest
어떤 경우에는 사용자에게 메시지를 표시할 수 있으며 성공 여부 rm
에 관계없이 실행되는 삭제를 시도합니다 . 삭제될 수 없는 디렉토리이거나 삭제될 수 없는 디렉토리에 대한 심볼릭 링크인 경우. 디렉토리에 대한 현재 쓰기 액세스에 액세스할 수 없음) 또는 소스에 대한 심볼릭 링크(해당 이름으로 디렉토리가 아닌 파일이 존재하는 경우 실패함).ln -s source dest
dest/source
dest
rm
rm
dest
그리고:
unlink dest
ln -s source dest
프롬프트 부분과 일부 시스템 및 특정 조건에서 디렉토리 링크를 해제할 수 있다는 사실을 제외하면 unlink
모두 동일합니다 . unlink
또한 XSI 옵션 아래 POSIX 사양에 태그가 지정되어 있으며 rm
.
dest
따라서 목적이 심볼릭 링크를 생성하는 것이라면 source
다음을 수행하는 것이 좋습니다.
GNU 특정:
ln -sfT source dest
(이것은
-T
비활성화됩니다입력하다dest
모드 에서는 디렉터리인지 여부에 관계없이 생성될 것으로 예상되는 파일로 처리합니다 .가지고 다닐 수 있는:
rm -f dest && ln -sf source dest
rm
with는-f
사용자에게 메시지를 표시하지 않으며 파일이 처음에 존재하지 않아도 실패하지 않습니다. 성공하면 파일이 더 이상 존재하지 않는다는 것을 알 수 있습니다(또는 적어도rm
파일을 성공적으로 삭제한 후 확인되지 않은 경우). 그러나 다른 사람이 디렉터리를 (재)생성하거나ln
.source/dest
dest
rm
ln
답변2
ln -sfn source dest
적어도 GNU coreutils에 대한 문서는 ln
오해의 소지가 있습니다. 그것은 말한다:
-f, --force
기존 대상 파일 삭제
효과적으로 GNU가 ln -f
하는 일은 임시 이름으로 새 심볼릭 링크를 만든 다음 를 호출하는 것입니다 renameat
. 이는 대상 심볼릭 링크를 원자적으로 대체합니다. 물론아니요기존 기호 링크를 제거하여 시작하십시오.
man ln
전반적으로 이것이 바람직한데 왜 거짓말인지 모르겠습니다 .
이 경우에는 그냥 결과
그러면 상황도 다르지 않을 것입니다.