mv
"folder"라는 폴더를 이미 "folder"가 포함된 디렉터리로 이동하면 해당 폴더가 병합되거나 교체되나요 ?
답변1
mv
디렉터리는 병합하거나 덮어쓸 수 없습니다. 메시지와 함께 실패합니다."mv: 'a'를 'b'로 이동할 수 없습니다: 디렉토리가 비어 있지 않습니다.", 이 옵션을 사용하는 경우에도 마찬가지입니다 --force
.
이 문제를 해결하기 위해 다른 도구(예 rsync
: find
, 또는 심지어 cp
)를 사용할 수 있지만 다음과 같은 의미를 신중하게 고려해야 합니다.
rsync
한 디렉터리의 내용을 다른 디렉터리로 병합하는 것이 가능합니다(이상적으로는 성공적으로 전송된 소스 파일만 안전하게 삭제하려면 옵션--remove-source-files
1을-a
사용 하고 원하는 경우 일반적인 권한/소유권/시간 저장 옵션도 사용합니다)
...하지만이는 완전한 복사 작업이므로 디스크 공간을 많이 차지할 수 있습니다.- 당신은 그것을 사용할 수 있습니다
find
대상에서 소스 디렉터리 구조를 순차적으로 다시 만든 다음 실제 파일을 개별적으로 이동합니다
.하지만이는 소스에서 여러 번 반복되어야 하며 경쟁 조건이 발생할 수 있습니다(다단계 프로세스 중에 소스에 새 디렉터리 생성). cp
하드링크 생성 가능(단순히 동일한 기존 파일에 대한 추가 포인터) 병합과 매우 유사한 결과를 생성합니다mv
(실제 데이터를 복사하지 않고 포인터만 생성되므로 IO 효율적입니다)
.하지만이것은 다시 경쟁 조건으로 인해 어려움을 겪습니다(소스의 새 파일은 이전 단계에서 복사되지 않았더라도 삭제됨).(참고: rsync부터는 더 이상 작동하지 않습니다.버전 3.2.6)rsync
옵션 을 결합하여--link-dest=DIR
(파일 내용을 복사하는 대신 가능한 경우 하드 링크 생성)--remove-source-files
일반 경로와 동일하게 만들 수 있습니다mv
.
이를 위해서는--link-dest
절대 경로가 제공되어야 합니다 .원천디렉터리(또는 상대 경로목적지도착하다원천).
…하지만이는--link-dest
예상치 못한 방식으로 사용되며(복잡성을 유발할 수도 있고 그렇지 않을 수도 있음) 소스에 대한 절대 경로를 알아야(또는 결정해야 함)( 에 대한 인수로) 다시 빈 디렉토리 구조를 남겨두고 1--link-dest
정리에 따라 진행합니다. .
이러한 해결 방법(있는 경우) 중 어느 것이 적절한지는 특정 사용 사례에 따라 크게 달라집니다.
항상 그렇듯이 이러한 명령을 실행하기 전에 두 번 생각하고 백업을 만드십시오.
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
상위 폴더()에 복사합니다 .destination
folder
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/{}'