mv가 대상에 동일한 이름을 가진 디렉토리의 존재를 처리할 수 없는 이유는 무엇입니까?

mv가 대상에 동일한 이름을 가진 디렉토리의 존재를 처리할 수 없는 이유는 무엇입니까?

mv동일한 이름의 디렉터리가 있는 대상으로 디렉터리를 이동할 수 없습니다.

$ mv fortran/ imperative_PLs/
mv: cannot move ‘fortran/’ to ‘imperative_PLs/fortran’: Directory not empty
  1. 이 경우 왜 mv작동하지 않습니까? 시스템 호출로 설명할 수 있나요 mv? (비교할 수 있습니다 rsync)

  2. mv이 경우 디자인이 작동하지 않는 이유는 무엇입니까 ? 그 이유나 요점은 무엇입니까?

답변1

mv그리고 rsync유사한 프로그램이 아닙니다. 특히 mv단순히 객체의 이름을 바꾸려고 시도하는 것이 일반적입니다. 동일한 파일 시스템에 있으면 내용이 전혀 복사되지 않습니다.

아직 수행하지 않은 경우 imperative_PLs/fortran기존 mv디렉터리 fortran를 사용하여 트리의 해당 지점으로 이름이 변경됩니다.

하지만 해당 위치에 이미 디렉터리(콘텐츠 포함)가 있습니다. 이름은 단일 개체만 참조할 수 있으므로 기존 디렉터리를 삭제하거나 이름을 바꿔야 합니다. mv아무것도 하고 싶지 않고 중단했다고 가정해 보겠습니다.

rsync대신, 개별 파일과 그 안의 기타 콘텐츠를 복사하여 fortran기존 imperative_PLs/fortran디렉터리에 배치하세요.

오히려 rename이 행동은 이해하기 더 쉬워 보입니다.

답변2

  1. mv이 경우에는 작동하지 않습니다. 그렇게 하도록 설계되지 않았기 때문입니다. 시스템 호출은 (아마도)

    • 동일한 파일 시스템으로 이동: ( rename원본 linkunlink)
    • 파일 시스템 간 이동: 재귀적 파일 복사 후 재귀적unlink
  2. 의견: 내 생각에 이것은 의도적으로 그렇게 많은 것은 아니다.아니요이 사용 사례를 처리하도록 설계되지 않았기 때문에 작동합니다. 한 가지 작업을 효과적으로 수행하도록 설계된 "간단한" 도구의 경우 mv다음 작업 경로 중 어떤 작업을 수행할지 나타내는 스위치 세트를 제공해야 합니다 .

    • 현재 구현에서와 같이 오류가 발생하면 종료됩니다.
    • 병합할 때 파일이 이미 존재하면 오류가 발생합니다.
    • 병합하여 기존 대상 파일 바꾸기

cp병합/바꾸기 작업이 원하는 경우에는 따르 거나 rm파일 트리 복사 유틸리티 중 하나를 사용하여 쉽게 수행 할 수 있습니다 tar.pax

답변3

mv실제로 rename비하인드 스토리.

한 파일을 다른 파일로 이동하는 경우 현재 mv수행 중인 작업을 알고 있으며 대상 파일을 덮어쓴 것으로 간주됩니다.

한 디렉터리를 다른 디렉터리로 이동하는 경우 mv원래 디렉터리의 기본 이름을 유지하고 대상 디렉터리에 생성하려는 것으로 가정됩니다. 해당 이름을 가진 디렉터리가 대상에 아직 존재하지 않거나 해당 이름을 가진 디렉터리가 존재하지만 비어 있는 경우 작업이 성공합니다.

그러나 대상 디렉터리가 이미 존재하고 비어 있지 않은 경우 이는 더 이상 하나가 아니며 rename대신 재귀적인 파일 및 디렉터리 삭제가 되어야 합니다. rename이 작업을 수행하도록 설계되지 않았으므로 mv사용자가 이 작업을 수행하고 싶지 않다고 가정하고 실패한다고 가정하기 때문에 실패하고 더 이상 진행되지 않습니다.

답변4

내부 내용을 다른 디렉토리로 바꾸려면 다음을 사용할 수 있습니다.

mv --backup=simple src dest

그러면 이름이 dest으로 변경되고 로 dest~이동됩니다 .srcdest

관련 정보