
먼저 이 점 참고해주세요아니요간단한 "두 개의 디렉토리 병합"은 소스가 변경될 때 해당 디렉토리의 병합을 업데이트된 상태로 유지하는 방법에 대한 질문입니다.
a
두 개의 디렉토리가 있고 다음 규칙에 따라 이들을 병합 b
하고 싶다고 가정해 보겠습니다 .c
- 항목은 존재 여부나 마지막으로 수정된 타임스탬프에 관계없이
a
항상 위치를 찾아야 합니다 .c
- 공백을 메우세요
b
.
필요한 경우 간단한 cp
from b
to 및 덮어쓰기로 작업을 수행할 수 있습니다(필요한 것보다 더 많이 복사하지만 한 번만 사용).c
a
이제 내가 원하는 것은 업데이트를 유지하는 방법이므로(이것은 에 있어야 하기 때문에 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 "$<" "$@"