1. ホーム
  2. bash

[解決済み] rsyncです。--include-from vs. --exclude-from 実際の違いは何ですか?

2022-02-10 13:25:13

質問事項

ドキュメントでは、インクルードするパターンと除外するパターンのどちらかのリストを含むファイルであると言及されています。 しかし、これはインクルードについては、パターンにマッチするものを除き、すべてが除外とみなされることを意味します。 例えば、以下のようなインクルードファイルがあるとします。

/opt/**.cfg

という名前のディレクトリの下のどこかに存在する *.cfg という名前のファイルのみを含める必要があります。 opt ツリー内の任意の場所で つまり、以下のようにマッチします。

/opt/etc/myfile.cfg
/some/dir/opt/myfile.cfg
/notopt/opt/some/other/dir/myfile.cfg

従って、それ以外のものは暗黙のうちに除外されるものと思っています。 しかし、項目別の出力ではこのように表示されるので、そうではないようです。

*deleting   etc/rc.d/init.d/somescript

で、どうするかというと --include-from--exclude-from ? の単なるエイリアスなのでしょうか? --filter-from ?

解決方法は?

rsync はそのように動作しません。ファイル名パターンがincludeまたはexcludeパターンのいずれにもマッチしないファイルは、includeされたものとみなされます。つまり、includeパターンはexcludeパターンを上書きする方法だと考えてください。

から ドキュメント (強調)。

Rsync は、コマンドラインで指定された include/exclude オプションの順序付きリストを構築します。Rsync は、各ファイルとディレクトリ名を各 exclude/include パターンに照らして順番にチェックします。最初に一致したパターンが処理されます。exclude パターンの場合、そのファイルはスキップされます。インクルードパターンの場合、そのファイル名はスキップされません。 一致するinclude/excludeパターンが見つからない場合、そのファイル名はスキップされません。

つまり、特定のファイルだけをインクルードしたい場合は、まず インクルード その特定のファイルを 除外する 他のすべてのファイル

--include="*/" --include="*.cfg" --exclude="*"

ここで注意すべきことが2つあります。

  1. その include なぜなら、最初にマッチしたパターンが考慮されるからです。もしファイル名が最初に除外パターンにマッチすれば、それは除外されます。

  2. のように、すべてのサブディレクトリを個別にインクルードする必要があります。 --include="/opt" --include="/opt/dir1" などですべてのサブディレクトリを含めるか、--include="*/"ですべてのディレクトリ(ファイルではない)を含めるかです。私は簡潔さのために2番目のオプションを選択しました。

癖があり、あまり直感的ではありません。そのため、以下をお読みください。 ドキュメント をよく読んで(リンク先の "EXCLUDE PATTERNS" のセクション)、その上で --dry-run または -n オプションを使用して、あなたが考えるとおりに動作することを確認します。