전체 디렉터리를 담기에는 너무 작은 USB 장치를 사용하여 연결이 끊긴 두 서버 간에 큰 디렉터리를 동기화하고 싶습니다. 각 서버는 대부분의 데이터를 보유하고 있으며 변경된 파일은 USB 장치에 들어갈 만큼 작습니다.
다음 단계를 수행하는 데 사용할 수 있는 도구가 있습니까?
- 장치 B: 디렉터리 D의 해시를 계산하여 USB 장치에 저장합니다.
- 장치 A: 해시를 계산하고 비교합니다. 동기화되지 않은 파일을 USB 장치에 추가하고 삭제된 파일을 기록해 둡니다.
- 장치 B: 동기화가 USB 장치에서 D로 변경되었으며 이제 장치 A와 동일한 버전을 갖습니다.
내가 아는 한, rsync, rdiff-backup 및 unison과 같은 도구는 이를 지원하지 않으므로 이에 대한 최선의 해결책은 이를 수행하는 몇 가지 간단한 스크립트를 작성하는 것입니다.
답변1
가장 쉬운 방법은 크로스오버 케이블을 사용하여 두 시스템을 연결하는 것입니다. :) 하지만 반드시 플래시와 테이프를 사용해야 한다면 다음과 같이 할 수 있습니다.
존재하다목적지기계:
find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >dst.txt
dst.txt
파일을 다음 위치에 복사하세요 .원천기계
존재하다원천기계:
find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >src.txt
comm -23 src.txt dst.txt | cut -b 43- | (cd /some/dir; tar cJvf - --files-from -) | split -b 3500MB -d
x*
파일을 하나씩 복사하세요.목적지기계rm -f x* src.txt dst.txt
존재하다목적지기계를 다시:
cat $( ls -1 x* | sort ) | (cd /some/dir; tar xJvpf -)
rm -f x*
작동 방식:
dst.txt
파일에는src.txt
두 컴퓨터에 있는 파일의 SHA-1 합계가 포함되어 있습니다.comm -23 src.txt dst.txt
선택 항목은 다음에만 존재합니다.원천기계 또는 둘 다 존재하지만 다릅니다.cut -b 43-
파일 이름만 유지하십시오. 이는 복사해야 하는 파일 목록입니다.cd /some/dir
CWD
소스 디렉터리 변경tar cJvpf - --files-from -
여러 개의 아카이브를 만들고,--files-from -
아카이브할 파일 목록을 읽고stdin
, 아카이브를 에 쓰라고f -
지시하고 , 압축하여 아카이브하고 , 아카이브할 파일 목록을 인쇄합니다 .tar
stdout
J
xz
v
tar
stderr
split -b 3500MB -d
아카이브를 3500MB 청크로 나눕니다. (4GB 플래시가 있고 한 번에 모든 데이터를 저장할 수 없다고 가정합니다. 아마도 전혀 이 작업을 수행할 필요가 없을 것입니다.)cat $( ls -1 x* | sort )
x*
파일을 연결하는sort
것이 올바른 순서로 수행되는지 확인할 수 있습니까?cd /some/dir
CWD
대상 디렉터리 변경tar xJvpf -
파일을 저장합니다.J
압축 해제를 표시하고xz
,p
권한 복원을 표시하고,v
작업을 상세하게 만들고, 아카이브에서 읽을 것을f -
지시합니다 .tar
stdin
tar
마지막으로 @Stéphane Chazelas 면책 조항: 이는 (1) 두 컴퓨터의 파일 이름에 개행 문자가 포함되어 있지 않고 (2) 미러링되는 디렉터리가 너무 깊지 않다고 가정합니다(파일의 최대 경로 길이에 제한이 있음). 아카이브이며 매우 높지는 않습니다 - 200자 IIRC).
답변2
tar
매개변수를 결합하면 -N | --newer | --after
도움이 될까요? 지정된 날짜 이후 수정된 모든 파일을 백업할 수 있습니다.
각 실행 전에 파일 목록을 생성하는 경우( find
예: 이 출력을 사용하면 대상 서버에서 추가 파일을 삭제할 수 있습니다.