소스 목록에 없는 대상에서 rsync 삭제 디렉토리를 만드는 방법

소스 목록에 없는 대상에서 rsync 삭제 디렉토리를 만드는 방법

여러 디렉터리의 파일을 하나의 디렉터리로 동기화하고 싶습니다. 소스 목록에서 디렉터리를 제거하면 해당 디렉터리와 해당 파일이 모두 대상에서 제거되기를 원합니다.

다음은 간단한 샘플입니다.

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있습니다 .dir3dir1dir2

예(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-linksrsyncdir3dir2dir12/dir2--deletedir3/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/삭제하려는 모든 디렉터리에 대한 자리 표시자로 사용합니다 .

관련 정보