ドキュメントでは、これらを含めるパターンまたは除外するパターンのリストを含むファイルであると述べています。ただし、インクルージョンの場合は、パターンと一致する場合を除き、すべてが除外と見なされます。したがって、たとえば、次を含むインクルードファイル:
/opt/**.cfg
ツリー内のopt
anyという名前のディレクトリの下にある* .cfgという名前のファイルのみを含める必要があります。したがって、次のように一致します。
/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
はそのようには機能しません。包含または除外パターンのいずれとも一致しないファイル名パターンを持つファイルは、含まれていると見なされます。つまり、包含パターンを除外パターンをオーバーライドする方法と考えてください。
docs から:
Rsyncは、コマンドラインで指定されたとおりに、包含/除外オプションの順序付きリストを作成します。 Rsyncは、各ファイルとディレクトリ名を各exclude/includeパターンに対して順番にチェックします。最初の一致パターンが処理されます。除外パターンの場合、そのファイルはスキップされます。包含パターンの場合、そのファイル名はスキップされません。 一致する包含/除外パターンが見つからない場合、ファイル名はスキップされません。
(エンファシス鉱山)
したがって、特定のファイルのみを含める場合は、最初にそれらの特定のファイルをinclude、次にexclude他のすべてのファイルを必要とします:
--include="*/" --include="*.cfg" --exclude="*"
ここで注意すべき点がいくつかあります。
include
パターンは除外の前に来る必要があります。これは、一致する最初のパターンが考慮されるためです。ファイル名が最初に除外パターンと一致する場合、除外されます。
すべてのサブディレクトリに対して--include="/opt" --include="/opt/dir1"
などのように、すべてのサブディレクトリを個別に含めるか、または--include = "* /"を使用してすべてのディレクトリ(ファイルではない)を含める必要があります。簡潔にするために、2番目のオプションを選択しました。
それは風変わりで非常に直感的ではありません。 docs を注意深く読んで(リンクの「除外パターン」セクション)、--dry-run
または-n
オプションを使用して、考えていることを確実に実行してください。する必要があります。
(私のように)マニュアルページのFILTER RULES
-セクションに頭を悩ませるのに苦労しているが、find
の基本を理解している場合は、代わりにそれを使用できます。
2016-02-01
から/storage/data
までのファイル名またはディレクトリ名の特定の日付(例:rsync_test
)ですべてを同期することを希望するとします。このようなことをしてください:
cd /storage/data
find . -name '*2016-02-01*' \
| rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test