rsyncでディレクトリ固有のルールを指定する方法は?

rsyncでディレクトリ固有のルールを指定する方法は?

INCLUDE/EXCLUDE PATTERN RULESマニュアルページのセクションには次のように記載されています。

パターンが / で始まる場合はファイル階層の特定の場所に固定され、そうでない場合はパス名の末尾と一致します。これは正規表現の前にある^に似ています。したがって、「/foo」は、「転送ルート」(グローバルルールの場合)またはマージされたファイルディレクトリ(ディレクトリ固有のルールの場合)の「foo」名と一致します。正規化されていない「foo」は、アルゴリズムが上から下に再帰的に適用されるため、ツリー内のどの場所でも「foo」名と一致します。各パスコンポーネントが順番にファイル名の末尾にあるかのように動作します。固定されていない「sub / foo」でも、「sub」というディレクトリに「foo」が見つかった階層のすべてのポイントと一致します。トランスポートルートで一致させるパターンを指定する方法の詳細については、「アンカー埋め込み/除外パターン」のセクションを参照してください。

ディレクトリ固有のルールを指定する方法は?どのような影響を与えますか?

ベストアンサー1

編集者のコメント:以下は、マニュアルの「ディレクトリ固有のルールと削除」セクションをそのままコピーしたものですrsync(1)

削除オプションがないと、ディレクトリ固有のルールは転送側にのみ関連するため、転送に影響を与えずにマージされたファイル自体を自由に除外できます。たとえば、

rsync -av --filter='dir-merge /.rsync-filter' --exclude=.excl host:src/dir /dest 
rsync -av --filter='dir-merge /.rsync-filter' host:src/dir /dest 


--filter='dir-merge /.rsync-filter' This tells rsync to look for per-directory .rsync-filter files that have
been sprinkled through the hierarchy and use their rules to filter the files in the transfer. If -F is repeated, it is a shorthand for this rule:

ただし、受信側で削除を実行し、特定のファイルが削除されないように除外する場合は、受信側から除外するファイルを知っていることを確認する必要があります。最も簡単な方法は、転送に「ディレクトリごとのファイルのマージ」を含め、--delete-afterを使用することです。これにより、受信者はアイテムを削除する前に送信者と同じ除外ルールを取得します。

rsync -avF --delete-after host:src/dir /dest 

ただし、ファイルが転送の一部ではない場合は、一部のグローバル除外ルール(コマンドラインなど)を指定するか、受信側で独自のディレクトリ固有のファイルを保持する必要があります。最初の例は次のとおりです(リモートの.rulesファイルが自分自身を除外すると仮定)。

rsync -av --filter='remote .rules' --filter='remote /my/extra.rules'
   --delete host:src/dir /dest

上記の例では、extra.rulesファイルはトランスポートの両方に影響を与える可能性がありますが、ルール(送信側)は各ディレクトリマージルールの後に指定されるため、.rulesファイルでマージされたルールが適用されます。

最後の例では、リモート側は転送から.rsync-filterファイルを除外しますが、独自の.rsync-filterファイルを使用して受信側から削除するエントリを制御しようとしています。これを行うには、ディレクトリごとにマージされたファイルを具体的に除外し(削除されないように)、削除しないその他の項目を制御する規則をローカルファイルに配置する必要があります。次のコマンドのいずれかと同じです。

   rsync -av --filter=':e /.rsync-filter' --delete \
        host:src/dir /dest
    rsync -avFF --delete host:src/dir /dest

おすすめ記事