web-dev-qa-db-ja.com

rsync:--include-from vs. --exclude-from実際の違いは何ですか?

ドキュメントでは、これらを含めるパターンまたは除外するパターンのリストを含むファイルであると述べています。ただし、インクルージョンの場合は、パターンと一致する場合を除き、すべてが除外と見なされます。したがって、たとえば、次を含むインクルードファイル:

/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の単なるエイリアスですか?

25
Craig

rsyncはそのようには機能しません。包含または除外パターンのいずれとも一致しないファイル名パターンを持つファイルは、含まれていると見なされます。つまり、包含パターンを除外パターンをオーバーライドする方法と考えてください。

docs から:

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

(エンファシス鉱山)

したがって、特定のファイルのみを含める場合は、最初にそれらの特定のファイルをinclude、次にexclude他のすべてのファイルを必要とします:

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

ここで注意すべき点がいくつかあります。

  1. includeパターンは除外の前に来る必要があります。これは、一致する最初のパターンが考慮されるためです。ファイル名が最初に除外パターンと一致する場合、除外されます。

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

それは風変わりで非常に直感的ではありません。 docs を注意深く読んで(リンクの「除外パターン」セクション)、--dry-runまたは-nオプションを使用して、考えていることを確実に実行してください。する必要があります。

81
Hari Menon

(私のように)マニュアルページの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
5
UlfR