mv
동일한 이름의 디렉터리가 있는 대상으로 디렉터리를 이동할 수 없습니다.
$ mv fortran/ imperative_PLs/
mv: cannot move ‘fortran/’ to ‘imperative_PLs/fortran’: Directory not empty
이 경우 왜
mv
작동하지 않습니까? 시스템 호출로 설명할 수 있나요mv
? (비교할 수 있습니다rsync
)mv
이 경우 디자인이 작동하지 않는 이유는 무엇입니까 ? 그 이유나 요점은 무엇입니까?
답변1
mv
그리고 rsync
유사한 프로그램이 아닙니다. 특히 mv
단순히 객체의 이름을 바꾸려고 시도하는 것이 일반적입니다. 동일한 파일 시스템에 있으면 내용이 전혀 복사되지 않습니다.
아직 수행하지 않은 경우 imperative_PLs/fortran
기존 mv
디렉터리 fortran
를 사용하여 트리의 해당 지점으로 이름이 변경됩니다.
하지만 해당 위치에 이미 디렉터리(콘텐츠 포함)가 있습니다. 이름은 단일 개체만 참조할 수 있으므로 기존 디렉터리를 삭제하거나 이름을 바꿔야 합니다. mv
아무것도 하고 싶지 않고 중단했다고 가정해 보겠습니다.
rsync
대신, 개별 파일과 그 안의 기타 콘텐츠를 복사하여 fortran
기존 imperative_PLs/fortran
디렉터리에 배치하세요.
오히려 rename
이 행동은 이해하기 더 쉬워 보입니다.
답변2
mv
이 경우에는 작동하지 않습니다. 그렇게 하도록 설계되지 않았기 때문입니다. 시스템 호출은 (아마도)- 동일한 파일 시스템으로 이동: (
rename
원본link
및unlink
) - 파일 시스템 간 이동: 재귀적 파일 복사 후 재귀적
unlink
- 동일한 파일 시스템으로 이동: (
의견: 내 생각에 이것은 의도적으로 그렇게 많은 것은 아니다.아니요이 사용 사례를 처리하도록 설계되지 않았기 때문에 작동합니다. 한 가지 작업을 효과적으로 수행하도록 설계된 "간단한" 도구의 경우
mv
다음 작업 경로 중 어떤 작업을 수행할지 나타내는 스위치 세트를 제공해야 합니다 .- 현재 구현에서와 같이 오류가 발생하면 종료됩니다.
- 병합할 때 파일이 이미 존재하면 오류가 발생합니다.
- 병합하여 기존 대상 파일 바꾸기
cp
병합/바꾸기 작업이 원하는 경우에는 따르 거나 rm
파일 트리 복사 유틸리티 중 하나를 사용하여 쉽게 수행 할 수 있습니다 tar
.pax
답변3
mv
실제로 rename
비하인드 스토리.
한 파일을 다른 파일로 이동하는 경우 현재 mv
수행 중인 작업을 알고 있으며 대상 파일을 덮어쓴 것으로 간주됩니다.
한 디렉터리를 다른 디렉터리로 이동하는 경우 mv
원래 디렉터리의 기본 이름을 유지하고 대상 디렉터리에 생성하려는 것으로 가정됩니다. 해당 이름을 가진 디렉터리가 대상에 아직 존재하지 않거나 해당 이름을 가진 디렉터리가 존재하지만 비어 있는 경우 작업이 성공합니다.
그러나 대상 디렉터리가 이미 존재하고 비어 있지 않은 경우 이는 더 이상 하나가 아니며 rename
대신 재귀적인 파일 및 디렉터리 삭제가 되어야 합니다. rename
이 작업을 수행하도록 설계되지 않았으므로 mv
사용자가 이 작업을 수행하고 싶지 않다고 가정하고 실패한다고 가정하기 때문에 실패하고 더 이상 진행되지 않습니다.
답변4
내부 내용을 다른 디렉토리로 바꾸려면 다음을 사용할 수 있습니다.
mv --backup=simple src dest
그러면 이름이 dest
으로 변경되고 로 dest~
이동됩니다 .src
dest