rsync
다양한 성능 문제가 있었습니다. 동기화를 수행할 수 없었습니다 O(#changes)
. 체크섬 대신 수정 시간을 사용하더라도 여전히 변경된 모든 파일의 목록을 생성해야 하므로 몇 시간이 걸리거나 임의의 한도에 도달할 수 있습니다. 그러나 예를 들어 기록 중 복사 파일 시스템을 사용하면 하드 드라이브를 다시 검색하는 데 드는 몇 분(또는 몇 시간)의 오버헤드 없이 즉시 "최소" 차이를 전송할 수 있습니다.
물론 다음 알고리즘을 사용하면 가능합니다.
my-ideal-rsync --modified-since "2020-10-10 12:00:00"
각 폴더를 재귀적으로 살펴보고 폴더의 마지막 수정 시간(해당 시간 이후 수정된 경우)을 확인하여 O(디스크의 # 파일) 파일) 시간 목록/전송/스트림 대신 최적의 O(수정된 파일 #개) 시간을 확인합니다. 수정된 파일은 주어진 명령에서 마지막으로 전송되었습니다.또는
my-ideal-rsync2
각 시스템의 폴더를 고정된 방식으로 재귀적으로 비교하여 위의 플래그 없이 이를 달성할 수 있습니다.루트부터 반복적으로 시작하여 모든 하위 inode를 쌍(소스, 대상)으로 정렬합니다.
- 소스 inode의 마지막 수정 시간이 동일한 경우 재귀가 없습니다.
- 소스 inode의 마지막 수정 시간이 최신인 경우 반복(디렉토리인 경우)(또는 전송(파일인 경우))
- 소스 inode의 마지막 수정 시간이 오래된 경우 오류가 발생합니다.
- 소스 또는 대상 inode가 누락된 경우 가능한
mv
작업을 위해 대기열에 들어갑니다. 즉, 가능한 일치 대기열입니다.
- (재귀 종료 시 일치하는 항목이 없으면 각각 삭제하거나 생성하세요.)
위의 알고리즘에 버그가 있을 수도 있지만 이는 개념을 보여줍니다. 그런 게 있나요?
답변1
디렉터리 수정 시간은 파일 수정 시간과 관련이 없습니다. – Emma Luo 1월 29일 7시 41분
디렉토리 수정 시간(적어도 ext4 등에서)에 대한 나의 오해로 인해 "하위 디렉토리의 파일 변경" 시간을 제공하는 파일 시스템을 사용하지 않으면 그러한 알고리즘이 불가능한 것 같습니다. (또는 나중에 rsync에 대한 변경 사항을 추적하기 위해 파일 수정 데몬이 실행되고 있지 않는 한 fs를 읽기 전용으로 설정하십시오 ... duh.)
지금 질문에 대답하려면, "이러한 알고리즘은 아마도 일반 파일 시스템에서는 되돌릴 수 없을 것입니다. 왜냐하면 dir mtimes는 파일 mtimes와 독립적이기 때문입니다. 다음을 사용하십시오.btrfs send
답변2
rsync 프로그램은 그렇지 않습니다기록차이점이 있으므로 전체 디렉터리 트리를 검색해야 합니다.
이와 대조적으로 git
버전 제어 시스템은 파일 및 디렉터리에 대한 수정 사항을 추적하고 모든 기록을 유지하므로 이것이 바로 여러분에게 필요한 것일 수 있습니다.