mv를 사용하여 폴더를 병합하시겠습니까?

mv를 사용하여 폴더를 병합하시겠습니까?

mv"folder"라는 폴더를 이미 "folder"가 포함된 디렉터리로 이동하면 해당 폴더가 병합되거나 교체되나요 ?

답변1

mv디렉터리는 병합하거나 덮어쓸 수 없습니다. 메시지와 함께 실패합니다."mv: 'a'를 'b'로 이동할 수 없습니다: 디렉토리가 비어 있지 않습니다.", 이 옵션을 사용하는 경우에도 마찬가지입니다 --force.


이 문제를 해결하기 위해 다른 도구(예 rsync: find, 또는 심지어 cp)를 사용할 수 있지만 다음과 같은 의미를 신중하게 고려해야 합니다.

  • rsync한 디렉터리의 내용을 다른 디렉터리로 병합하는 것이 가능합니다(이상적으로는 성공적으로 전송된 소스 파일만 안전하게 삭제하려면 옵션 --remove-source-files1을-a 사용 하고 원하는 경우 일반적인 권한/소유권/시간 저장 옵션도 사용합니다)
    ...하지만이는 완전한 복사 작업이므로 디스크 공간을 많이 차지할 수 있습니다.
  • 당신은 그것을 사용할 수 있습니다find대상에서 소스 디렉터리 구조를 순차적으로 다시 만든 다음 실제 파일을 개별적으로 이동합니다
    .하지만이는 소스에서 여러 번 반복되어야 하며 경쟁 조건이 발생할 수 있습니다(다단계 프로세스 중에 소스에 새 디렉터리 생성).
  • cp하드링크 생성 가능(단순히 동일한 기존 파일에 대한 추가 포인터) 병합과 매우 유사한 결과를 생성합니다 mv(실제 데이터를 복사하지 않고 포인터만 생성되므로 IO 효율적입니다)
    .하지만이것은 다시 경쟁 조건으로 인해 어려움을 겪습니다(소스의 새 파일은 이전 단계에서 복사되지 않았더라도 삭제됨).
  • rsync옵션 을 결합하여 --link-dest=DIR(파일 내용을 복사하는 대신 가능한 경우 하드 링크 생성) --remove-source-files일반 경로와 동일하게 만들 수 있습니다 mv.
    이를 위해서는 --link-dest절대 경로가 제공되어야 합니다 .원천디렉터리(또는 상대 경로목적지도착하다원천).
    하지만이는 --link-dest예상치 못한 방식으로 사용되며(복잡성을 유발할 수도 있고 그렇지 않을 수도 있음) 소스에 대한 절대 경로를 알아야(또는 결정해야 함)( ​​에 대한 인수로) 다시 빈 디렉토리 구조를 남겨두고 1--link-dest 정리에 따라 진행합니다. .
    (참고: rsync부터는 더 이상 작동하지 않습니다.버전 3.2.6)

이러한 해결 방법(있는 경우) 중 어느 것이 적절한지는 특정 사용 사례에 따라 크게 달라집니다.
항상 그렇듯이 이러한 명령을 실행하기 전에 두 번 생각하고 백업을 만드십시오.


1: 디렉터리는 삭제되지 않으므로 빈 소스 디렉터리 트리를 삭제하려면 다음과 같은 rsync --remove-source-files작업을 수행해야 합니다 .find -depth -type d -empty -delete

답변2

rsync -av /source/ /destination/
(after checking)
rm -rf /source/

답변3

-l다음 옵션을 사용할 수 있습니다 .CP생성하는 명령하드 링크데이터의 전체 복사본이 아닌 동일한 파일 시스템의 파일. 다음 명령은 폴더를 해당 이름의 디렉터리가 이미 포함된 source/folder상위 폴더()에 복사합니다 .destinationfolder

cp -rl source/folder destination
rm -r source/folder

필요에 따라 -P( --no-dereference- 심볼릭 링크를 역참조하지 않음) 또는 -a( --archive- 모든 메타데이터를 보존하고 옵션도 포함 )을 사용할 수도 있습니다 .-P

답변4

디렉토리를 병합하는 방법은 다음과 같습니다. 파일을 복사한 다음 삭제하는 대신 파일 이름을 바꾸기 때문에 rsync보다 훨씬 빠릅니다.

cd source; find -type f -print0 | xargs -0 -n 1 -I {} mv '{}' 'dest/{}'

관련 정보