나는 다음 주제를 읽었습니다.
그러나 내가 아는 한(뭔가 빠졌을 수도 있음) 다음 문제는 다루지 않습니다.
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
.