まずこの点を参考にしてくださいいいえ単純な「2つのディレクトリのマージ」は、ソースが変更されたときにそのディレクトリのマージを更新したままにする方法に関する質問です。
a
2つのディレクトリがあり、次の規則に従ってそれらをマージし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/
利点:すべてのサブツリーで再帰的に機能します。
欠点:最初のコマンドの開始から2番目のコマンドの実行が終了するまでの期間、「a /」に似た「b /」の最新のファイルは、交換されるまで一時的に「c /」に配置できます。 。 2番目のコマンドで、「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 "$<" "$@"