rsync가 호출할 때마다 동일한 파일을 계속 보내는 이유는 무엇입니까?

rsync가 호출할 때마다 동일한 파일을 계속 보내는 이유는 무엇입니까?

SSH를 통해 Linux에서 Mac으로 파일을 복사하기 위해 rsync를 사용하고 있습니다.

내 명령은 다음과 같습니다

rsync \
    --exclude FOO \
    --exclude BAR \
    -e ssh \
    -rclpvih \
    --delete \
    --stats \
    /local/dir/ \
    host:/remote/dir/

출력은 다음과 같습니다.

building file list ... done
...
<fc.T...... core/FileRecordingProcessor.cpp
<fc.T...... core/Pipeline.hpp
...

Number of files: 4,910 (reg: 4,401, dir: 509)
Number of created files: 0
Number of regular files transferred: 35
Total file size: 332.34M bytes
Total transferred file size: 2.62M bytes
Literal data: 0 bytes
Matched data: 2.62M bytes
File list size: 196.59K
File list generation time: 0.457 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 209.72K
Total bytes received: 12.03K

sent 209.72K bytes  received 12.03K bytes  147.83K bytes/sec
total size is 332.34M  speedup is 1,498.70

로컬에서 아무것도 변경되지 않은 경우에도 rsync는 각 호출에서 동일한 (하위) 파일 집합을 전송합니다.

해당 파일은 전체 트리의 작은 하위 집합일 뿐입니다. 다른 파일은 실제로 변경되지 않는 한 다시 전송되지 않습니다. 재전송되는 파일 수는 항상 35개입니다. 모두 <fc.T......플래그가 있습니다.

파일은 로컬 컴퓨터와 원격 컴퓨터에서 동일하게 보입니다.

현지의:

$ ll core/Pipeline.hpp
-rw-r--r-- 1 victor victor 5.1K Nov  2 18:24 core/Pipeline.hpp
$ md5sum core/Pipeline.hpp
7604940d777322a587d2fe2fa12c1183  core/Pipeline.hpp

원격:

$ ll core/Pipeline.hpp
-rw-r--r-- 1 victor staff 5.1K Nov  3 18:20 core/Pipeline.hpp
$ md5sum core/Pipeline.hpp
7604940d777322a587d2fe2fa12c1183  core/Pipeline.hpp

소유자, 그룹, 시간이 동일하지 않지만 rsync는 이를 보존하도록 구성되지 않고 다음과 같이 구성됩니다.체크섬 사용.

두 컴퓨터의 시간은 동기화되지 않습니다.

답변1

이런 일이 발생할 수 있는 한 가지 사례는 rsync가 대소문자 구분 파일 시스템(일반적으로 Linux)과 대소문자 구분 파일 시스템(일반적으로 Windows 및 MacOS) 간에 파일을 전송할 때입니다.

동기화된 두 경로(예: d/xd/X)가 소문자로 명목 변환한 후 동일하면 rsync는 이를 인식하지 못하고 을 전송할 수 있으며 d/x동일한 대상 파일을 로 덮어씁니다 d/X.

파일에 동일한 데이터가 포함되어 있지 않고 타임스탬프가 동일한 경우 향후 rsync 실행 시 파일이 항상 업데이트됩니다.

일부 대문자/소문자 차이로 인해 rsync가 실수로 파일을 다시 전송하는지 확인하는 것이 좋습니다. 유용한 Linux 명령 중 하나는 다음과 같습니다.

find . | tr '[:upper:]' '[:lower:]' | LC_ALL=C sort | LC_ALL=C uniq -d

원천

답변2

--archive( -a) 또는 --times( ) 플래그 가 누락되었습니다 -t. 그 중 하나가 없으면 rsync변경 시간을 추적할 수 없으므로 이미 복사된 것처럼 보이는 파일을 우회할 수 없습니다.

rsync또한 파일이 복사되었는지 확인하기 위해 체크섬을 사용하도록 명시적으로 지시하고 있습니다 rsync.

일반적으로 --archive( -a) 플래그는 필요한 모든 작업을 수행합니다.

rsync --exclude FOO --exclude BAR -avi --delete --stats /local/dir/ host:/remote/dir/

-H하드 링크(있는 경우)를 유지하고 -AXACL 및 확장 속성(있는 경우)을 유지하기 위해 추가할 수 있습니다 .

답변3

핵심요약: macOS를 사용하는 경우 "brew", "nix" 또는 기타 시스템이 설치할 수 있는 오픈 소스 rsync 대신 /usr/bin/rsync를 사용해 보세요. 기본 rsync는 Apple의 특수 파일 시스템을 더 잘 이해하고 변경되지 않은 파일을 다시 복사하지 않습니다.

더 긴 버전...

rsync이런 일이 발생할 수 있는 상황은 사용 중인 버전이 OS별 상황을 지원하지 않는 경우입니다 . 변경된 것으로 생각되지만 변경되지 않은 파일을 다시 복사합니다.

예를 들어 내 Mac에는 다음 두 가지 버전이 있습니다 rsync.

$ which -a rsync
/usr/local/bin/rsync
/usr/bin/rsync

/usr/local/bin/rsync프로토콜 버전 31을 지원하는 버전 3.2.4입니다. 저는 "brew"를 사용하여 이것을 설치했습니다.

/usr/bin/rsync버전 2.6.9(훨씬 이전 버전)에서 분기된 Apple 제공 버전으로, 프로토콜 버전 29를 지원합니다. Apple은 macOS 관련 파일 시스템 기능을 지원하도록 이 버전을 향상했습니다.

오픈 소스 버전을 사용하면 -c변경되지 않은 파일이 다시 복사됩니다. Apple에서 제공하는 rsync에는 이 문제가 없습니다.

프로토콜 버전 29와 31 사이에는 많은 최적화가 있지만 아마도 이를 놓치지 않을 것입니다. Apple의 rsync를 사용하여 문제를 해결하는 것이 아마도 중요할 것입니다.

답변4

나는 결국 전환했다.조화Linux와 macOS(및 Windows) 간의 동기화:

unison \
    -servercmd /usr/local/bin/unison
    -ignore "Name FOO" \
    -ignore "Name BAR" \
    -auto \
    -batch \
    -force /local/dir/ \
    /local/dir/ \
    ssh://host/remote/dir/

관련 정보