소스 목록에 없는 대상에서 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플래그는 분명히 효과가 없습니다 . AND를 동기화하는 대신 dir1및 상위 디렉토리의 내용을 동기화할 수 있습니다 dir2.dir3dir1dir2

예( -i변경 사항을 보려면 rsync 플래그를 사용하십시오):

$ 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/삭제할 모든 디렉터리에 대한 자리 표시자 역할을 합니다 .

관련 정보