rsync가 "파일 이름 변경"을 정상적으로 처리하지 않는다는 것이 사실입니까?

Nov 17 2020

백업 도구를 사용하는 동안 duplicity소스의 파일 이름을 바꾸면 데이터가 네트워크를 통해 대상으로 다시 전송된다는 사실을 알게 되었습니다 . internaly를 duplicity사용 하기 때문에 .librsyncrsync

이 위키 백과 페이지 에는 다음과 같은 내용이 있습니다.

핸들 이름 변경 이동 / 이름 변경된 파일이 감지되고 두 번 저장되거나 전송되지 않습니다. 일반적으로 파일 또는 해당 청크의 체크섬이 계산됨을 의미합니다. 이 기능이없는 애플리케이션은 이름 변경 만 동기화하는 hsyncAUR과 결합하여 보완 할 수 있습니다.

rsync : 핸들 이름 변경 : 아니요

이것은를 사용할 때rsync 원본 컴퓨터에서로 이름 /test/10GBfile을 바꾸면 을 ( /test/10GBfile_newname를) 사용할 때 10GB가 네트워크를 통해 대상으로 다시 전송되는 것을 방지 할 방법이 없다는 것을 의미합니까 ?

의 오랜 인기를 감안할 때이 문제를 rsync더 잘 처리 할 수있는 모드가 없습니까?

답변

2 roaima Nov 17 2020 at 19:53

rsync실행 중 외에는 상태를 유지하지 않으므로 이름 변경을 추적하는 메커니즘이 없습니다 . 원본 컴퓨터에서로 이름 /test/10GBfile을 바꾸면 /test/10GBfile_newname기본적 으로 삭제 되고 생성 된 rsync것만 볼 수 있습니다 .10GBfile10GBfile_newname

--fuzzy매개 변수 ( -y) 식별하는 데 도움이 될 수 있습니다 10GBfile에 대한 데이터의 잠재적 인 소스로 10GBfile_newname대상에하여 파일 복사의 비용으로 네트워크 사본을 피하는. 그러나, (주로) 파일 만의 경기를 고려할 수 같은 디렉토리에 귀하의 예는,의 이름 변경을 일치합니다 그래서 비록 /test/10GBfile/test/otherdir/10GBfile_newname하지 않을 것입니다.

공지 사항 문서는 (또한 man rsync) 사용할 경우 것을 조언 --delete대신 사용해야 하나 --delay-updates또는 --delete-after그래서에 대한 잠재적 인 일치 --fuzzy가 사용되기 전에 삭제되지 않습니다.

# Prepare an uncompressible 100MB file
mkdir -p /tmp/test
dd bs=1M count=100 iflag=fullblock if=/dev/urandom >/tmp/test/file1

# Normal first-time copy
rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test

# Skip copy because unchanged
rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test

# Rename file (per your example)
mv /tmp/test/file1 /tmp/test/file2

# Fast copy because fuzzy match
rsync -av --fuzzy --delete-after /tmp/test/ remote:/tmp/test

두 개의 -v플래그 (예 :)를 더 추가 rsync -avvv …하여 무슨 일이 벌어지고 있는지 블록 별 세부 정보를 확인합니다.

1 laktak Nov 17 2020 at 20:03

--fuzzy 이미 답변을 받았지만 하드 링크와 관련된 또 다른 흥미로운 해킹이 있습니다.

첫 이체 후

$ rsync -avHP --delete-after ~/family/Photos remotebox:backups

하드 링크 된 작업 디렉토리를 만듭니다.

$ cd ~/family
$ cp -rlp Photos Photos-work

그런 다음 사용할 수 있습니다

$ rsync -avHP --delete-after --no-inc-recursive ~/family/Photos ~/family/Photos-work remotebox:backups

새 구조를 리모컨으로 전송합니다.

이것이 작동하는 이유와 방법은 여기에 설명되어 있습니다.

https://lincolnloop.com/blog/detecting-file-moves-renames-rsync/