cp는 대상을 덮어쓰지 않고 하드 링크를 덮어씁니다.

cp는 대상을 덮어쓰지 않고 하드 링크를 덮어씁니다.

다음과 같은 설정이 있다고 가정해 보겠습니다.

$ cat fileA
textA
$ cat fileB
textB
$ ln fileA myLink
$ cat myLink # as expected
textA

다음 동작을 이해하지 못합니다.

$ cp fileB fileA
$ cat myLink # expected ?
textB

내가 썼다면 이런 결과를 예상했을 텐데, ln -s fileA myLink여기서는 그렇지 않았다.

cp오버레이 모드에서 다음을 수행 하고 싶습니다 .

  1. fileB하드 드라이브 어딘가의 내용을 복사하세요.
  2. fileA하드 드라이브 주소 링크

하지만 그 대신에 나는 그것이 다음과 같은 일을 한다고 추론합니다:

  1. 링크를 따라가세요fileA
  2. fileB이 주소의 내용을 복사하세요.

작동하지 않는 것 같습니다 mv. 예상한 대로 작동합니다.

내 질문:

  1. 내가 놓친 곳이 설명되어 있습니까 man cp?man mvman ln
  2. 이 행동은 단지 우연일까요?(if 의 크기가 fileB보다 크지 않다고 가정 fileA), 아니면 함수로 안정적으로 사용할 수 있나요?
  3. 이것이 하드링크의 개념을 무너뜨리는 것이 아닌가?
  4. 다음 줄이 계속 표시 cp fileB fileA되도록 해당 줄을 수정하는 방법이 있습니까 ?cat myLinktextA

답변1

하드 링크에 대한 "링크 따르기"는 없습니다. 하드 링크를 만드는 것은 동일한 파일에 여러 가지 다른 이름을 지정하는 문제일 뿐입니다. (낮은 수준에서 파일은 실제로 정수입니다. - "inodes", 해당 이름은 단지 사용자 편의를 위한 것입니다. ) - " "원본"과 "복사본"이 없습니다 - 동일합니다. 따라서 열고 쓰는 하드 링크는 정확히 동일하며 모두 동일합니다.

따라서 cp기본적으로 파일은 열리고 파일에 기록되며 파일(및 포함된 이름)이 변경됩니다. 그렇습니다. 이것은 예상됩니다. 이제 (다시 쓰는 대신) 먼저 이름 중 하나를 삭제한 다음(링크 수를 줄임) 사용자 이름과 동일한 이름으로 새 파일을 다시 생성하면 결국 두 개의 다른 파일이 생성됩니다. 그게 cp --remove-destination해야 할 일입니다.

1기본 사항은 다음 문서 link(2)에 문서화되어 있습니다.ln(1)

2예, 이는 정상적인 동작이며 우연이 아닙니다. 그런데 위에 댓글을 보세요cp --remove-destination

아니 정말. 하드 링크는 동일한 파일에 대한 여러 이름일 뿐입니다. 당신이 원하는 것은 특수 파일 시스템에만 존재하는 COW(기록 중 복사) 링크입니다.

4예,cp --remove-destination fileB fileA

답변2

예, 이는 예상된 동작입니다. ln fileA myLink만들다하드 링크즉, fileA와 myLink는 동일한 디스크 파일의 두 이름입니다.

ls -il디스플레이 용인덱스 노드숫자의 경우 예제가 끝나면 두 개의 서로 다른 파일만 생성되는 것을 볼 수 있습니다.

참조한 매뉴얼 페이지 외에도 읽어보고 싶을 수도 있습니다.man 2 link기본 시스템 호출에 대한 자세한 내용입니다.


나는 cp가 새로 생성된 fileB 복사본에 대한 링크로 fileA에 대한 링크를 덮어쓸 뿐만 아니라 실제로 fileA에 대한 링크를 따라가서 거기에 fileB의 복사본을 쓴다고 추론합니다.

당신은 무엇을 오해협회예. cpmyLink에 대한 링크처럼 "fileA에 대한 링크를 따르지" 않습니다. 두 디렉토리 항목 모두 동일한 inode에 연결됩니다. rm파일에 액세스할 때 기본 시스템 호출의 이름이 지정된다는 점을 고려하세요.unlink.

관련 정보