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.txt
별도로 보관됩니다 .b.txt
d.txt
README.txt
rsync를 사용하여 이를 달성할 수 있는 방법이 있습니까?
편집하다:결론은 rsync로는 이 작업을 수행하는 것이 불가능하다는 것 같습니다. 이것이 왜 필요한지 질문을 받았는데, 사용 사례를 설명하자면 다음과 같습니다.
웹 서버가 있다고 가정해 보겠습니다. 해당 웹서버에는 여러 개의 디렉토리가 있습니다. 디렉토리 A
와 public_html
내 웹사이트를 제공하는 디렉토리가 있다고 가정해 보겠습니다. 디렉토리에 파일을 생성하는 자동화된 프로세스가 있다고 가정해 보겠습니다 A
. 생성된 파일을 rsync(또는 다른 도구를 사용하여 동기화)하고 싶습니다.고쳐 쓰다A
rsync가 실수 로 내 사이트를 public_html
삭제 public_html
하는 것을 원하지 않습니다.
rsync가 해당 작업에 적합한 도구가 아닌 경우 이 작업을 수행할 수 있는 방법을 아는 사람이 있습니까?
답변1
하고 싶은 일은 합리적이지만 rsync
혼자서 하는 것은 합리적이지 않습니다. 그래서 대답은아니요.
이유는 간단합니다. rsync
각 디렉터리의 콘텐츠 기록을 유지하지 않으면 삭제해야 할 콘텐츠와 삭제하지 말아야 할 콘텐츠를 알 수 있는 방법이 없습니다. 추가 지원 없이는 불가능합니다.
왜 이 일을 즐기는지 스스로에게 물어보고 rsync
더 명확하게 설명해야 합니다. 더 똑똑한 프로그램도 있습니다 librsync1.so
.
필요하지 않은 느슨한 제약 조건을 사용하면
rsync
다음을 볼 수 있습니다.rdiff 백업:
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 백업은 네트워크를 통해 실행할 수도 있습니다.)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"
삭제한 파일은 서버에서 삭제되지만 저장소에 추가되지 않은 다른 데이터는 삭제되지 않습니다.
답변2
rsync 명령의 일부로 수신 측의 파일을 명시적으로 제외하지 않으면 이것이 가능하지 않다고 생각합니다. rsync 매뉴얼 페이지 섹션인 "디렉터리별 규칙 및 삭제"를 참조하십시오.
삭제 옵션이 없으면 디렉터리별 규칙은 전송 측에만 적용되므로 전송에 영향을 주지 않고 병합된 파일 자체를 자유롭게 제외할 수 있습니다. 이를 쉽게 하기 위해 "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
답변3
내가 올바르게 이해했다면 이것이 --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
답변4
이에 대한 답이 있습니다. 나는 그것이 효과가 있다고 생각합니다. 이것은 나에게 효과적입니다. 먼저 rsync
원격 파일을 로컬 파일로 전송해야 합니다. 그런 다음 로컬 측에는 모든 파일이 포함됩니다.
sudo rsync -r -a -v --delete /[email protected]:/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/ [email protected]:/remote_dir/
그것은 준다
c.txt
d.txt
README.md
원격 측과 로컬 측의 파일. ( --delete
원격 측과 로컬 측의 다른 파일은 다음을 사용하여 삭제할 수 있습니다.원격일치하지 않음지역측).