ln -sfn 및 rm 및 연결 해제

ln -sfn 및 rm 및 연결 해제

심볼릭 링크를 제거하고 이를 다른 항목에 연결하고 싶습니다. 이를 수행하는 방법에는 3가지가 있습니다.

ln -sfn source dest
rm dest
ln -s source dest
unlink dest
ln -s source dest

세 가지 모두 동일합니까? 하나를 다른 것보다 선호해야 합니까?

답변1

그것들은 동일하지 않습니다.

존재하다:

ln -sfn source dest

대상을 역참조하지 않는 옵션은 -n비표준 확장입니다( ln1994년 버전 3.10에 추가된 GNU의 확장이라고 생각합니다). 일부는 동일한 기능(1997년 이후 NetBSD와 같은)을 ln갖고 있고 , Solaris/Illumos와 같은 일부는 추가 기능(GNU 이전 ) 을 가지고 있습니다 .-h-nln-n

GNU 동작을 가정 -n하면 dest디렉토리로 존재하는 경우 dest/source파일 자체가 디렉토리가 아닌 한 동일한 이름의 파일(있는 경우)을 대체하기 위해 파일이 생성됩니다.

dest그렇지 않으면 기존 파일을 대체하기 위해 심볼릭 링크가 생성됩니다(있는 경우) source.

ln이동/복사/링크할 수 있는 짜증나고 모호한 인터페이스를 좋아하거나 cp갖고 있습니다.mv도착하다목적지 또는입력하다하지만 이는 사용자가 원하는 것이 아니라 마지막 인수의 유형(또는 인수 수)에 따라 달라집니다.

존재하다:

rm dest
ln -s source dest

rmdest어떤 경우에는 사용자에게 메시지를 표시할 수 있으며 성공 여부 rm에 관계없이 실행되는 삭제를 시도합니다 . 삭제될 수 없는 디렉토리이거나 삭제될 수 없는 디렉토리에 대한 심볼릭 링크인 경우. 디렉토리에 대한 현재 쓰기 액세스에 액세스할 수 없음) 또는 소스에 대한 심볼릭 링크(해당 이름으로 디렉토리가 아닌 파일이 존재하는 경우 실패함).ln -s source destdest/sourcedestrmrmdest

그리고:

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
    

    rmwith는 -f사용자에게 메시지를 표시하지 않으며 파일이 처음에 존재하지 않아도 실패하지 않습니다. 성공하면 파일이 더 이상 존재하지 않는다는 것을 알 수 있습니다(또는 적어도 rm파일을 성공적으로 삭제한 후 확인되지 않은 경우). 그러나 다른 사람이 디렉터리를 (재)생성하거나 ln.source/destdestrmln

답변2

ln -sfn source dest

적어도 GNU coreutils에 대한 문서는 ln오해의 소지가 있습니다. 그것은 말한다:

-f, --force
                     기존 대상 파일 삭제

효과적으로 GNU가 ln -f하는 일은 임시 이름으로 새 심볼릭 링크를 만든 다음 를 호출하는 것입니다 renameat. 이는 대상 심볼릭 링크를 원자적으로 대체합니다. 물론아니요기존 기호 링크를 제거하여 시작하십시오.

man ln전반적으로 이것이 바람직한데 왜 거짓말인지 모르겠습니다 .

이 경우에는 그냥 결과

그러면 상황도 다르지 않을 것입니다.

관련 정보