다음 테스트 사례를 고려해보세요.
mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
예상대로 rsync는 c/test
하드 링크를 생성합니다 b/test
(참조 횟수 참고 2
).
# ls -l c/test
-rw-r--r-- 2 root root 16 Jan 6 19:43 test
이제 이것을 보세요:
rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
하드 링크가 생성되지 않았습니다.
# ls -l c/test
-rw-r--r-- 1 root root 16 Jan 6 19:50 test
이것맨페이지말했다(강조):
모든 파일은 동일해야 합니다예약하다파일을 함께 연결하기 위한 속성(예: 권한, 소유권)
그러나 기본적으로 파일 시간은 그렇지 않다고 생각합니다.예약하다따라서 여기에는 차이가 없어야 합니다.
뭐가 문제 야? 이것은 버그입니까? 어떡해?
내 목표는 동일한 파일을 모두 하드 링크하여 저장소의 여러 분기를 호스팅하는 연속 통합 서버의 공간을 절약하는 것입니다. 그래서 내 실제 명령은 다음과 같습니다
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123
.
즉, 시간에 구애받지 않는다는 의미이므로 touch
이전에는 현재 시간에 모두 추가하는 것을 고려했지만 rsync
이는 다소 조잡한 해결책이 될 것이며 터치가 재귀적으로 작동하지 않는 것 같습니다.
답변1
크기와 타임스탬프를 기준으로 파일 전송을 결정하는 rsync의 "빠른 확인" 알고리즘의 결과가 표시됩니다. 세부사항은 다음과 같습니다 man rsync
:
Rsync는 크기나 마지막 수정 시간이 변경된 파일을 찾는 "빠른 확인" 알고리즘(기본값)을 사용하여 전송해야 하는 파일을 찾습니다. 빠른 검사 결과 파일의 데이터를 업데이트할 필요가 없음이 나타나면, 유지된 다른 속성(옵션에서 요청한 대로)에 대한 모든 변경 사항이 대상 파일에 직접 적용됩니다.
다음과 같은 옵션이 있습니다.
타임스탬프를 무시하고 변경된 크기만을 기준으로 파일을 전송하려는 경우 이
--size-only
옵션을 사용할 수 있습니다.이는
rsync
파일 크기를 동일하게 변경하는 경우 변경된 파일이 전송되지 않음을 의미합니다.rsync
파일의 내용이 실제로 동일한지 확인 하려면 를 사용하세요--checksum
. 이로 인해 상당한 속도 저하가 발생할 수 있습니다.
"빠른 검사" 알고리즘은 일반적으로 속도와 정확성 사이에서 적절한 절충안을 제공하므로 기본 알고리즘입니다.