소스 폴더에서 삭제된 파일을 rsync 삭제하려면 어떻게 해야 합니까?

소스 폴더에서 삭제된 파일을 rsync 삭제하려면 어떻게 해야 합니까?

저는 최근에 게임 서버를 호스팅하기 위해 Ubuntu Server를 갖춘 컴퓨터를 설정했습니다. 컴퓨터의 특정 폴더에 게임 세계 파일을 자주 백업하는 백업 플러그인을 각 게임 서버에 설치했습니다. 또한 cron옵션과 함께 rsync를 사용하여 매일 밤 해당 백업을 Dropbox 폴더에 자동으로 복사하는 작업을 설정했습니다 -a.

몇 달 후 내 Dropbox 계정이 저장 용량 한도에 도달했고 너무 많은 백업을 보관할 수 없다는 것을 깨달았습니다. 그래서 너무 많은 백업을 보관하지 않도록 게임 서버 백업 플러그인을 구성한 다음 며칠 동안 기다렸다가 보관할 수 있는지 확인했습니다. 매주 수행되도록 예약된 이전 백업을 삭제합니다. 백업 플러그인은 결국 작업을 수행하고 이전 백업을 삭제했기 때문에 cron 작업이 이후에 소스 폴더와 일치하도록 Dropbox 폴더에서 이전 백업을 삭제할 것으로 예상했지만 rsync그렇게 하지 않았습니다. 그래서 몇 가지 질문이 있습니다.

  • 기본적으로 rsync다음 작업만 수행합니다.추가하다원본 폴더에 추가된 파일을 대상 폴더로변화원본 폴더에서 변경되었지만 파일삭제하지 않음원본 폴더에서 삭제된 파일은 무엇입니까?

  • 그렇다면 rsync이를 수행하는 가장 좋은 방법은 무엇입니까? 대상 폴더가 원본 폴더를 완벽하게 반영하기를 원합니다. 이는 원본 폴더에서 삭제된 모든 파일을 삭제하는 것을 의미합니다.

트릭을 수행할 수 있는 몇 가지 옵션이 매뉴얼 페이지에 나열되어 있지만 rsync익숙하지 않기 때문에.

답변1

대상에서 파일을 삭제하려면 --delete명령에 옵션을 추가하세요. 예를 들어:

rsync -avh source/ dest/ --delete

NB: -avh입니다--archive --verbose --human-readable

답변2

그만큼재동기화delete해당 명령에서 일부 옵션을 사용하는 동안 명령은 파일을 삭제하지 않습니다 . 따라서 소스에 추가된 파일이나 폴더가 있으면 삭제하지 않고 대상에 동기화됩니다.

rsync소스 파일에서 백업을 만들고 find ... rm일정 기간 또는 파일 크기에 따라 파일을 삭제하는 데 사용하는 것이 좋습니다 .

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

위의 코드 블록은 소스에서 백업을 만든 다음 마지막 수정 시간이 2개월 이상인 모든 파일을 삭제합니다.

업데이트

옵션 은 deleteTARGET에만 해당되므로 일부 파일이 소스에서 제거되면 rsync --deleteTARGET에서 제거하십시오. 그리고 매뉴얼 페이지에 언급된 대로 and delete의 옵션은 다음과 같습니다.afterbefore

--delete-before         receiver deletes before transfer, not during

의미:

  1. rsync는 SOURCE에서 제거된 TARGET에서 파일을 삭제합니다.
  2. rsync가 파일 동기화를 시작합니다.
--delete-after          receiver deletes after transfer, not during

의미:

  1. rsync가 파일 동기화를 시작합니다.
  2. rsync는 동기화 후 SOURCE에서 제거된 TARGET에서 파일을 삭제합니다.

메모: --delete-{before/after}TARGET에 바로 구현되었습니다.

답변3

명령

$ rsync -avhn --delete local/ remote/

로컬에서 수행된 변경 사항을 항상 원격으로 동기화하도록 주의를 기울입니다. 즉, 동기화에 주의를 기울여야 함을 의미합니다.현지의그리고원격그렇게

  1. 파일추가됨~에현지의에 추가됩니다원격
  2. 파일제거됨~에서현지의에서 제거됩니다원격
  3. 파일추가됨~에원격제거되었습니다
  4. 파일제거됨~에서원격에서 복원됩니다현지의존재하는 경우, 그렇지 않은 경우 무시됩니다.

설명된 매개변수:

  • -a아카이브 모드
  • -v장황함을 증가시키다
  • -h사람이 읽을 수 있는 형식으로 숫자를 출력합니다.
  • -n시험 실행, 변경 사항 없이 시험 실행을 수행합니다.데이터 손실을 방지하려면 처음에는 항상 이 플래그를 사용하십시오.. 만족스러우면 제거하세요.

결과가 스스로 말하게 하십시오:

  • 2개의 디렉터리를 생성합니다.

    $ mkdir local/ remote/
    
  • 그 안에 파일을 생성하세요

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
    
  • 무엇이 생성되었는지 확인하세요(재동기화 전):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
    
  • rsync 호출:

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    
  • 결과 보기(재동기화 후):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only
    

보시다시피 파일은원격/원격_전용되었습니다삭제됨, 파일로컬/로컬_전용되었습니다동기화됨.

답변4

rsync scync 중에 오류가 발생하면 rsync는 --delete, --delete-after또는 를 사용한 경우에도 있어야 하는 파일을 제대로 삭제하지 않습니다 --delete-before.

이것이 rsync 오류를 해결하는 것이 중요한 이유입니다.

--perms내 오류의 대부분은 비 Linux 파일 시스템과 동기화하는 동안 옵션을 사용했기 때문에 발생했습니다 . --perms으로 바꾸면 --no-perms해당 오류가 사라지고 삭제가 작동했습니다.

--permsLinux 파일 시스템에서 다른 Linux 파일 시스템으로 동기화하는 경우에는 문제가 없지만 Linux에서 비 Linux 파일 시스템(예: NTFS, FAT)으로 동기화하는 경우 --perms오류가 발생합니다.rsync는 Linux가 아닌 파일 시스템에서 Linux 권한을 설정할 수 없습니다.. 다시 말하지만, 오류 = 삭제되지 않습니다.

- Linux가 아닌 파티션에 동기화할 때 , 또는 를 --no-perms방해하는 오류를 방지하기 위해 사용합니다 .--delete--delete-after--delete-before

그 후에도 여전히 오류가 발생하고 해당 오류를 해결하는 방법을 알 수 없는 경우 동기화되지 않은 파일 삭제 전용 명령을 실행할 수 있습니다.

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

위의 명령은 동기화되지 않은 항목을 삭제하지만 파일은 동기화되지 않습니다. 따라서 이후에는 다시 동기화해야 합니다. 그 명령은 이것을 기반으로합니다답변, 인수도 추가했다는 점을 제외 --ignore-errors하면 오류가 있어도 삭제됩니다.

관련 정보