송신측에 존재하지 않는 파일을 삭제하려면 수신측에 rsync를 요청했지만 수신측에서는 예외가 발생했습니다.

송신측에 존재하지 않는 파일을 삭제하려면 수신측에 rsync를 요청했지만 수신측에서는 예외가 발생했습니다.

나는 다음 주제를 읽었습니다.

그러나 내가 아는 한(뭔가 빠졌을 수도 있음) 다음 문제는 다루지 않습니다.

rsync송신측, 수신측에 존재하지 않는 파일의 복사 및 삭제를 요청하는 방법 (예외)은 무엇입니까? (예를 들어 .hg송신 측에 저장소가 없더라도 수신 측의 Mercurial 저장소를 삭제하지 마십시오 .)

한 가지 가능성은요?

아래 @Richard Holloway의 답변을 빌리십시오. 다음과 같은 줄이 있다고 가정해 보겠습니다.

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

rsync내가 이해한 바에 따르면 이 줄은 전송 경로에 없는 모든 항목을 제거합니다 dont_delete_me. 이제 내 질문은 rsync가 수신 측에서 동일하게 유지되는지입니다.dont_delete_me 보낸 사람이 일치하는 항목이 없는 경우에도 마찬가지입니까 dont_delete_me?

답변1

--delete와 를 모두 사용하면 --exclude원본 파일을 삭제하더라도 제외된 위치의 내용은 삭제되지 않습니다.

rsync하지만 이로 인해 폴더가 전혀 삭제 되지 않는 문제가 발생합니다 . 따라서 해당 폴더 rsync에 대한 다른 작업이 필요합니다 sync.

예를 들어.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

이를 반대 방향으로 실행할 수도 있지만 삭제된 파일을 모두 제거한 다음 교체하므로 그다지 효율적이지 않습니다.

라이너로는 할 수 없습니다.

답변2

내 목적에 적합한 다음 솔루션을 찾았습니다.

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(참고: -n테스트 실행을 수행하는 옵션을 추가하고 --delete로 변경하지 마세요 --delete-excluded!)

이 명령을 실행하면 다음 속성이 생성됩니다.

  • 소스 src디렉터리는 변경되지 않고 그대로 유지됩니다.
  • 대상 dest폴더는 다음을 제외하고 소스 폴더와 일치합니다.

    • 목록에 있는 항목은 do_not_send_to_dest대상으로 전송되지 않으며,
    • 목록의 항목은 do_not_modify_in_dest대상에서 변경되지 않은 상태로 유지됩니다.
  • (참고: 존재하지 않는 프로젝트가 " " 파일에 나열되어 있어도 문제가 없습니다 do_not_.)

설명하다

rsync가 명령줄 인수를 왼쪽에서 오른쪽으로 읽으면 --delete인수로 인해 rsync가 내부적으로 (어떤 의미에서) "모드 전환"을 하여 옵션을 다시 사용할 수 있게 되는 것처럼 보이지만 --exclude-from의미는 다릅니다.

경고하다:

  • 목록의 항목이 do_not_send_to_dest이미 대상에 있는 경우 다음을 수행합니다.

    • 이 명령은 대상에서 프로젝트를 제거하지 않습니다(프로젝트가 소스 디렉터리에서 먼저 제거되지 않는 한).
    • 경고하다:--delete로 변경하면 --delete-excluded두 목록 중 하나에 나열된 대상의 모든 내용이 삭제됩니다. xD(rsync는 개방형/유연하도록 작성되었지만 약간의 뉘앙스가 있습니까?)

가벼운 사용 테스트.

""를 사용하고 있습니다 rsync version 3.0.9 protocol version 30.

관련 정보