두 디렉터리 업데이트 및 병합

두 디렉터리 업데이트 및 병합

먼저 이 점 참고해주세요아니요간단한 "두 개의 디렉토리 병합"은 소스가 변경될 때 해당 디렉토리의 병합을 업데이트된 상태로 유지하는 방법에 대한 질문입니다.

a두 개의 디렉토리가 있고 다음 규칙에 따라 이들을 병합 b하고 싶다고 가정해 보겠습니다 .c

  • 항목은 존재 여부나 마지막으로 수정된 타임스탬프에 관계없이 a항상 위치를 찾아야 합니다 .c
  • 공백을 메우세요 b.

필요한 경우 간단한 cpfrom bto 및 덮어쓰기로 작업을 수행할 수 있습니다(필요한 것보다 더 많이 복사하지만 한 번만 사용).ca

이제 내가 원하는 것은 업데이트를 유지하는 방법이므로(이것은 에 있어야 하기 때문에 Makefile) 에 새 파일이 있으면 복사하십시오 a. make에 새 파일이 있으면 복사하세요 b.make오직에 아직 없는 경우 c에서 a파일이 업데이트되면 make으로 업데이트하고 c, 에서 파일이 업데이트되면 으로 b업데이트합니다.c 오직만약 그것이 다음에서 온다면 b하지만아니요.a

정확하게 설명했으면 좋겠습니다.

답변1

원하는 상태를 달성하는 간단한 솔루션입니다. 다음 2가지 명령을 사용할 수 있습니다.

rsync -auv b/ c/
rsync -av a/ c/

이점:모든 하위 트리에서 재귀적으로 작동합니다.

결점:첫 번째 명령을 시작한 때부터 두 번째 명령 실행이 끝날 때까지의 기간 동안 "a/"와 유사한 "b/"의 일부 최신 파일은 교체될 때까지 일시적으로 "c/"에 배치될 수 있습니다. . 두 번째 명령을 통해 "a/"에서 올바른 파일을 가져옵니다.

따라서 솔루션은 다음 조건을 충족하는 경우에만 적합합니다.

  • 최종 결과가 필요하며 동기화 중 "c/" 상태는 신경 쓰지 않습니다.
  • 일부 파일을 몇 번 더 복사해야 하는 것에 신경 쓰지 않는다면.

답변2

Makefile이것부터 시작할 수 있습니다 .

나는 GNU Make 4.2.1을 사용하여 몇 가지 테스트를 수행했습니다. 다른 Make 버전에서도 작동하는지 모르겠습니다. a또는 에 하위 디렉토리가 있으면 실패한다는 것을 알고 있습니다 b. 어쩌면 다른 함정이 있을 수도 있습니다.

.PHONY: all

SRCA = a
SRCB = b

DEST = c

# create list of targets from wildcard lists of both sources
TARGETS = $(patsubst $(SRCA)/%,$(DEST)/%,$(wildcard $(SRCA)/*)) $(patsubst $(SRCB)/%,$(DEST)/%,$(wildcard $(SRCB)/*)) 

all: $(TARGETS)

# GNU Make prefers the first matching pattern rule because both rules lead to the same stem length 
$(DEST)/%:$(SRCA)/%
    cp "$<" "$@"

# alternative pattern rule if the first one does not match
$(DEST)/%:$(SRCB)/%
    cp "$<" "$@"

관련 정보