web-dev-qa-db-ja.com

includeオプションを使用して特定のタイプのファイルのみをrsyncコピーする

次のbashスクリプトを使用して、特定の拡張子(この場合は* .sh)のファイルのみをコピーしますが、それでもすべてのファイルをコピーします。どうしましたか?

 from = $ 1 
 to = $ 2 
 
 rsync -zarv --include = "*。sh" $ from $ to 
76
user881480

--includeは、それらのファイルのみを含めるのではなく、--excludeによって除外されるファイルのサブセットを含めるために使用されると思います。言い換えれば、includeの意味を考える必要があります除外しないでください

代わりに試してください:

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

Rsyncバージョン3.0.6以降では、次のように順序を変更する必要があります(コメントを参照)。

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

-mフラグを追加すると、宛先に空のディレクトリ構造が作成されなくなります。バージョン3.1.2でテスト済み。

したがって、*。shファイルのみが必要な場合は、すべてのファイル--exclude="*"を除外し、すべてのディレクトリ--include="*/"を含め、すべての* .shファイル--include="*.sh"を含める必要があります。

manページ のセクションパターンルールの包含/除外でいくつかの良い例を見つけることができます。

133
chepner

@chepnerによる回答は、ファイルが含まれているかどうかにかかわらず、事実に関係なくすべてのサブディレクトリをコピーします。ファイルを含まないサブディレクトリを除外し、ディレクトリ構造を保持する必要がある場合は、使用します

rsync -zarv  --Prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
40
WanderingMind

もう1つ追加:1つのディレクトリのみ(再帰なし)の拡張子でファイルを同期する必要がある場合は、次のような構造を使用する必要があります。

rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/

最初の--includeのドットに注意してください。 --no-rはこの構成では機能しません。

13
Serge Roussak

Manページの重要な部分は次のとおりです。

転送するファイル/ディレクトリのリストが作成されると、rsyncは転送される各名前を包含/除外パターンのリストに対して順番にチェックし、最初に一致したパターンが処理されます:除外パターンの場合、そのファイルはスキップされました;包含パターンの場合、そのファイル名はスキップされません。一致するパターンが見つからない場合、ファイル名はスキップされません。

要約する:

  • どのパターンにも一致しないということは、ファイルがコピーされることを意味します!
  • パターンが一致するとアルゴリズムは終了します

また、スラッシュで終わるものはディレクトリと一致しています(find -type dのように)。

この答えを上から引き離しましょう。

rsync -zarv  --Prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. ディレクトリをスキップしないでください
  2. .shファイルをスキップしないでください
  3. すべてスキップ
  4. (暗黙的に、何もスキップしないでください。ただし、上記のルールはデフォルトのルールが発生するのを防ぎます。)

最後に、--Prune-empty-directoriesは、最初のルールが場所全体に空のディレクトリを作成しないようにします。

6
Jim Hunziker