両方のディレクトリの更新とマージ

両方のディレクトリの更新とマージ

まずこの点を参考にしてくださいいいえ単純な「2つのディレクトリのマージ」は、ソースが変更されたときにそのディレクトリのマージを更新したままにする方法に関する質問です。

a2つのディレクトリがあり、次の規則に従ってそれらをマージしbたいとします。c

  • エントリは、存在するか最後に変更されたタイムスタンプに関係なく、a常に場所を見つける必要があります。c
  • 空白を埋めますb

必要に応じて、単純なcpfrom btoと上書きで操作を実行できます(必要以上にコピーしますが、一度だけ使用)。ca

今私が望むのは更新を維持する方法なので(これはにあるはずですMakefile)、新しいファイルがあればコピーしてくださいamakeに新しいファイルがある場合はコピーしてくださいbmakeただにまだ存在しない場合は、ファイルが更新された場合cに更新し、からファイルが更新されたときに更新します。amakecbc ただそれが次から来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 "$<" "$@"

関連情報