web-dev-qa-db-ja.com

同一のディレクトリ名に対する異なるrsyncの動作

2つのコードベースを同期したい。以下のコマンドは、異なる場所にtestという名前の2つのディレクトリがある1つのユースケースを考慮していないことを除いて、うまく機能しています。

  • /テスト/
  • / start/test /

$ rsync -avCz --delete-before --progress --exclude=test /tmp/codebase/ .

私がやりたいのは、/ testディレクトリをrsyncから完全に除外することですが、/ start/testをrsyncする必要があります。

Rsyncに引数として渡す必要のある静的なTXTファイルを考え出す必要はありません。それ以外の方法でこれを実現する方法はありますか?- -include VS -excludeおよび末尾のスラッシュ(-exclude = test /)は機能しませんでした私の予想通り。

4
anavarre

先頭の/を使用して、転送のルートでのみ一致させることができます。これを試して:

rsync -avCz --delete-before --progress --exclude=/test/ /tmp/codebase/ .

主要な/のmanページスニペットは次のとおりです。

パターンが/で始まる場合は、ファイルの階層内の特定の場所に固定されます。それ以外の場合は、パス名の末尾と照合されます。これは、正規表現の先頭の^に似ています。したがって、「/ foo」は、「転送のルート」(グローバルルールの場合)またはマージファイルのディレクトリ(ディレクトリごとのルールの場合)のいずれかで「foo」の名前と一致します。アルゴリズムは上から下に再帰的に適用されるため、修飾されていない「foo」はツリー内の任意の場所の「foo」の名前と一致します。各パスコンポーネントがファイル名の終わりになったかのように動作します。アンカーされていない「sub/foo」でさえ、「sub」という名前のディレクトリ内で「foo」が見つかった階層内の任意のポイントで一致します。

そして、末尾の/の場合:

パターンが/で終わる場合、通常のファイル、シンボリックリンク、またはデバイスではなく、ディレクトリにのみ一致します。

更新

あなたのコメントから、あなたも--delete-excludedオプションを探していると思います。

2
Graeme