rsync, 송신 측에서 삭제 된 수신 측의 파일을 삭제합니다. (그러나 모든 것을 삭제하지는 마십시오)


9

rsync를 사용하여 ...

  • 송신 측에서도 삭제 된 수신 측의 파일 삭제
  • 수신 측의 rsynced 디렉토리에있는 다른 파일을 삭제하지 마십시오

예를 들어 디렉토리가 있다고 가정 해 봅시다 local-src.

전에 : local-src 로컬로 포함 ...

a.txt
b.txt
c.txt

의 내용과 동기화하려는 원격 디렉토리를 local-src이라고 remote-src합니다.

전에 : remote-src 원격으로 포함 ...

a.txt
b.txt
c.txt
d.txt
README.md

다음에서 일부 파일을 삭제한다고 가정 해 봅시다 local-src.

로컬 삭제 후 : local-src 로컬로 포함 된 ...

c.txt

소스에서 삭제 된 파일도 대상에서 삭제되지만 대상에서 다른 파일은 삭제하지 않고 rsync를 사용하는 방법 예를 들어 목적지에 다음을 갖고 싶습니다.

로컬 삭제 후 : remote-src 원격으로 ...

c.txt
d.txt
README.md

즉, a.txtb.txt원격도 삭제되지만 d.txtREADME.txt혼자 남아 있습니다.

rsync로 이것을 달성 할 수있는 방법이 있습니까?

편집 : 평결은 rsync로는 불가능할 것으로 보입니다. 유스 케이스를 설명하기 위해 왜 이것이 필요한지 묻습니다.

웹 서버가 있다고 가정 해 봅시다. 그 웹 서버에는 많은 디렉토리가 있는데, 내 사이트가 제공되는 디렉토리 A와 디렉토리가 있다고 가정 해 봅시다 public_html. directory에 파일을 생성하는 자동화 된 프로세스가 있다고 가정 해 봅시다 A. 나는 rsync는 좋아 (또는 동기화 다른 도구 사용)를 생성하거나 파일 것 업데이트A받는 public_html내에있을 수있는 다른 임의의 파일을 삭제하지 않고, 디렉토리 public_html. 나는 rsync가 실수로 내 웹 사이트를 삭제하는 것을 원하지 않습니다.

rsync가이 작업을위한 도구가 아닌 경우 다른 사람이 어떻게이 작업을 수행 할 수 있는지 알고 있습니까?


2
질문을 다시 읽은 후에 rsync는 원격 폴더에 어떤 파일이 있는지 알 수있는 방법이 없기 때문에 이것이 가능하지 않다고 생각 합니다. 다른 도구를 찾아야 할 수도 있습니다.
Spack

rsync를 사용하면이 작업을 수행 할 수 없지만 파일을 삭제할 때마다 전체 디렉토리를 scp하면 해결책이 아니라 제안 사항 만 동기화 할 수 있습니다.
Aadi Droid

1
나는 당신이 이미 이것을 생각했다고 추측하지만,이 파일을 하위 디렉토리 (또는 다른 곳)에 넣고 public_html에서 참조 할 수는 없습니까? 이렇게하면 웹 서버 파일 시스템의 다른 부분에있는 파일에 영향을주지 않고 쉽고 명시 적으로 동기화 된 하나의 디렉토리가 있습니다.
MattJenko

답변:


2

당신이하고 싶은 것은 합리적이지만, rsync그것을 스스로 사용하는 것은 아닙니다. 따라서 대답은 ' 아니오' 입니다.

그 이유는 간단합니다. rsync각 디렉토리에있는 내용에 대한 기록을 유지하지 않고 삭제해야 할 항목과없는 항목을 알 수있는 방법이 없습니다. 추가 지원이 없으면 아닙니다.

왜 이런 일을 rsync하고 싶은지 스스로에게 더 명확하게해야합니다. librsync1.so보다 지능적인 다른 프로그램이 있습니다 .


필요없는 편안한 제약 조건 rsync으로 rdiff-backup을 살펴볼 수 있습니다 .

mkdir a
touch a/xx
touch a/yy
rdiff-backup a b
ls b 

이 표시 xx되고 yy있습니다 b.

touch b/zz
rm a/xx
rdiff-backup a b

이 표시 xx되고 zz있습니다 b. rdiff-backup또한 디렉토리 rdiff-backup-data를 보관하여 b변경 사항을 롤백 할 수 있으므로 rdiff-backup명령을 사용하여 정기적으로 제거해야 합니다. (이 예제는 로컬 파일을 사용하여 대상의 추가 데이터가 삭제되지는 않지만 네트워크를 통해 작동한다는 것을 보여줍니다).


다른 대안은 일부 분산 개정 제어 시스템 (mercurial, bazaar, git)을 설정하는 것입니다. 예를 들어 mercurial을 사용하면 모든 변경 사항을 서버에 푸시 한 다음 체크 아웃 된 파일을 업데이트하고 원격 서버에있는 추가 파일을 무시하는 스크립트 (Makefile 사용)를 가질 수 있습니다 개정 관리 대상이 아님).

서버에서 수행 할 작업 :

hg init
hg add file_list_excluding_that_should_not_should_be_deleted_if_not_on_client
hg commit -m "initial setup"

클라이언트에서 :

hg clone ssh://username@server/dir_to_repository

이제 클라이언트에서 파일을 제거하고 다음을 수행하십시오.

hg commit -m "removed file"
ssh username@server "cd dir_to_repository; hg update --clean"

제거 된 파일은 서버에서 제거되지만 다른 데이터 (저장소에 추가되지 않은)는 삭제되지 않습니다.


rsync 가이 작업을 수행하지 않는다는 것을 수락 할 수 있습니다. 그러나 rsync가 송신 측에서 어떤 파일이 삭제되었는지 알면 rsync를 사용하여 이것이 불가능하다는 데 동의하지 않습니다. 왜 diff의 수신 측에 해당 정보를 보낼 수 없습니까? 신선도를 비교 한 후 수신 측이 디렉토리의 다른 모든 것을 삭제하지 않고 diff에서 삭제 된 것으로 표시된 파일을 삭제할 수없는 이유를 알 수 없습니다. 디렉토리에서 다른 모든 (원본에서 삭제되지 않은) 무고한 파일을 삭제하면 나에게 불합리한 것처럼 보입니다.
Heather Miller

어쨌든 이것이 필요한 이유는 다음과 같습니다. 디렉토리가 있는데, A프로세스가 자동화되고 파일이 자동으로 생성 되는 디렉토리 입니다. 나는 웹 서버를 가지고, 그리고 내 나는 파일을 원하는 A받는 rsynced 할 public_html에서 다른 모든을 삭제하지 않고 물론, 웹 서버의 디렉토리 public_html웹 서버의 폴더. 다른 도구를 사용하여이를 달성하기위한 아이디어가 있다면 누구나 환영합니다. 이것을 반영하여 질문을 업데이트하겠습니다.
헤더 밀러

위의 첫 번째 의견을 명확히하기 위해 "rsync와 같은 도구로는 이와 같은 것이 불가능하다는 데 동의하지 않습니다"라고 말해야합니다. 직관적으로, 이것은 내가 달성하기가 너무 어렵지 않은 것처럼 보입니다 (내가 무언가를 놓친 경우가 아니면).
헤더 밀러

음 알았어. 나는 지금보고 있다고 생각한다- local-src어떤 프로세스가 디렉토리에서 변경 사항을 감시하지 않고도 디렉토리 에서 무언가가 언제 삭제되었는지 알 수 있습니까 ? 어쩌면 이것은 어려울 것입니다.
Heather Miller

@HeatherMiller 내가 쓴 것처럼 귀하의 요청은 합리적이지만 rsync도구는 아닙니다. 실현하십시오 sync에이 rsync동기화에서 제공하고 당신이 원하는 것을 정확히되지 않습니다. rsync초점 의 개발 에서 데이터 전송의 효율적 (최소화)에 중점을 두었습니다. rdiff-backup(및 가능한 cvsup) 다른 도구 는 그 기술을 사용했지만 추가 기능을 사용하여 작성했습니다.
Anthon

1

rsync 명령의 일부로 수신 측의 파일을 명시 적으로 제외하지 않으면 이것이 가능하지 않다고 생각합니다. rsync : "PER-DIRECTORY RULES AND DELETE"에 대한 매뉴얼 페이지 섹션을 참조하십시오.

삭제 옵션이 없으면 디렉토리 별 규칙은 전송 측에만 관련이 있으므로 전송에 영향을주지 않고 병합 파일 자체를 자유롭게 제외 할 수 있습니다. 이를 쉽게하기 위해 'e'수정자는이 두 개의 동등한 명령에서 볼 수 있듯이이 제외를 추가합니다.

          rsync -av --filter=': .excl' --exclude=.excl host:src/dir /dest
          rsync -av --filter=':e .excl' host:src/dir /dest

그러나 수신 측에서 삭제를 원하고 일부 파일을 삭제하지 않으려면 수신 측에서 제외 할 파일을 알고 있어야합니다. 가장 쉬운 방법은 디렉토리마다 병합 파일을 전송에 포함하고 --delete-after를 사용하는 것입니다. 이렇게하면 수신 측이 아무것도 삭제하려고 시도하기 전에 수신 측이 송신 측과 동일한 제외 규칙을 갖게됩니다.

          rsync -avF --delete-after host:src/dir /dest

그러나 병합 파일이 전송의 일부가 아닌 경우 일부 글로벌 제외 규칙 (예 : 명령 행에 지정)을 지정하거나 디렉토리마다 고유 한 디렉토리 별 병합 파일을 유지해야합니다. 받는 쪽. 첫 번째 예는 다음과 같습니다 (원격 .rules 파일이 자신을 제외한다고 가정).

   rsync -av --filter=’: .rules’ --filter=’. /my/extra.rules’
      --delete host:src/dir /dest

위의 예에서 extra.rules 파일은 전송의 양쪽에 영향을 줄 수 있지만 (보내는 쪽) 규칙은 디렉토리 별 병합 규칙 이후에 지정 되었기 때문에 .rules 파일에서 병합 된 규칙에 종속적입니다.

마지막 예제에서 원격 측은 전송에서 .rsync-filter 파일을 제외하지만 자체 .rsync-filter 파일을 사용하여 수신 측에서 삭제되는 항목을 제어하려고합니다. 이렇게하려면 디렉토리별로 병합 파일을 제외하고 (삭제되지 않도록) 로컬 파일에 규칙을 넣어 삭제하지 않아야 할 항목을 제어해야합니다. 다음 명령 중 하나와 같습니다.

       rsync -av --filter=':e /.rsync-filter' --delete \
           host:src/dir /dest
       rsync -avFF --delete host:src/dir /dest

0

내가 올바르게 이해했다면, --exclude당신이 찾고 있는 것일 수도 있습니다.

$ ls src dst
dst:
a.txt  b.txt  c.txt  d.txt  README.md

src:
c.txt
$ rsync --update --delete --recursive --exclude="d.txt" --exclude="README.md" src/ dst
$ ls src dst
dst:
c.txt  d.txt  README.md

src:
c.txt

음 ... 아니. 제외하려는 모든 파일을 수동으로 나열하고 싶지 않습니다. 나는 소스에서 삭제 한 파일을 삭제하기 위해 rsync 만 원합니다. 소스에서 대상의 동일한 디렉토리에 다른 가능한 파일이 무엇인지 알 필요는 없습니다.
Heather Miller

0

나는 그것에 대한 답변이 있습니다. 나는 그것이 작동한다고 생각합니다. 그리고 그것은 나를 위해 작동합니다. 먼저 rsync원격 파일을 로컬 파일로 만들어야 합니다. 그런 다음 로컬 측에 모든 파일이 포함됩니다.

sudo rsync -r -a -v --delete /root@xx.xx.xx.xx:/remote_dir/ /local_dir/

지금은 현지에서

a.txt
b.txt
c.txt
d.txt
README.md

그런 다음 파일을 삭제하거나 원하는 것을 수행 할 수 있습니다 (로컬 측). 귀하의 질문에, 당신은 이러한 파일을 삭제합니다.

삭제 된 파일

a.txt
b.txt

그런 rsync다음 원격 파일에 로컬 파일을 저장할 수 있습니다.

sudo rsync -r -a -v --delete /local_dir/ root@xx.xx.xx.xx:/remote_dir/

그것은 준다

c.txt
d.txt
README.md

원격 측과 로컬 측의 파일을 사용합니다 (를 사용 --delete하면 원격 측로컬 측 과 일치하지 않는 다른 파일을 삭제합니다 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.