
여러 디렉터리의 파일을 하나의 디렉터리로 동기화하고 싶습니다. 소스 목록에서 디렉터리를 제거하면 해당 디렉터리와 해당 파일이 모두 대상에서 제거되기를 원합니다.
다음은 간단한 샘플입니다.
mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3
이제 dir3에는 "dir1/file1" 및 "dir2/file2"가 포함됩니다.
다시 rsync하고 목록에서 dir2를 제거하면 다음과 같습니다.
rsync -a dir1 dir3
그런 다음 dir2/file2 및 dir2를 대상에서 제거하고 싶습니다.
rsync에 대한 --delete 옵션은 dir1과 dir3/dir1 사이의 삭제만 처리하므로 dir2는 그대로 유지됩니다(--delete를 사용하는 경우에도).
rsync에 대한 매뉴얼 페이지에서 다양한 옵션을 살펴봤지만 rsync에게 모든 소스를 "결합"하고 "--delete"가 수행되도록 "하나의" 트리로 간주하도록 지시하는 옵션이 표시되지 않습니다. 내가 원하는 것. 그러나 나는 이런 일을 하고 싶어하는 최초의 사람이 아니라고 확신합니다.
아이디어?
답변1
--delete
여러 소스 디렉터리를 하나의 대상 디렉터리에 동기화하면 플래그가 분명히 작동하지 않습니다 . 및를 동기화하는 대신 dir1
및 의 상위 디렉토리 내용을 동기화할 수 dir2
있습니다 .dir3
dir1
dir2
예(rsync 플래그를 사용하여 -i
변경 사항 확인):
$ mkdir -p dir12/dir1 dir12/dir2 dir3
$ touch dir12/dir1/file1 dir12/dir2/file2
$ rsync -ai dir12/ dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
# BEFORE: dir1 and dir2 were synced to dir3
$ rm -rf dir12/dir2
$ rsync -ai --delete dir12/ dir3
*deleting dir2/file2
*deleting dir2/
.d..t...... ./
# AFTER: dir3/dir2 is gone
공통 상위 디렉토리가 없으면 dir12/dir2
실제 디렉토리를 가리키는 심볼릭 링크일 수 있습니다. 첫 번째 호출에서 옵션 -L
( )을 사용하면 (심볼릭 링크 대신) 디렉토리와 동일한 디렉토리 구조를 얻게 됩니다 . 그리고 심볼릭 링크를 삭제 하고 디렉터리 와 다시 동기화하면 예제와 같이 사라집니다.--copy-links
rsync
dir3
dir2
dir12/dir2
--delete
dir3/dir2
편집하다:
나는 조금 주위를 둘러보고 해킹을 발견했을 수도 있습니다.
$ mkdir empty dir1 dir2 dir3
$ touch dir1/file1 dir2/file2
$ rsync -ai dir1 dir2 dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
$ rsync -ai --delete empty/ dir1 dir3
*deleting dir2/file2
*deleting dir2/
.d..t...... ./
empty/
삭제하려는 모든 디렉터리에 대한 자리 표시자로 사용합니다 .