次のbashスクリプトを使用して、特定の拡張子(この場合は* .sh)のファイルのみをコピーしますが、それでもすべてのファイルをコピーします。どうしましたか?
from = $ 1 to = $ 2 rsync -zarv --include = "*。sh" $ from $ to
--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ページ のセクションパターンルールの包含/除外でいくつかの良い例を見つけることができます。
@chepnerによる回答は、ファイルが含まれているかどうかにかかわらず、事実に関係なくすべてのサブディレクトリをコピーします。ファイルを含まないサブディレクトリを除外し、ディレクトリ構造を保持する必要がある場合は、使用します
rsync -zarv --Prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
もう1つ追加:1つのディレクトリのみ(再帰なし)の拡張子でファイルを同期する必要がある場合は、次のような構造を使用する必要があります。
rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/
最初の--include
のドットに注意してください。 --no-r
はこの構成では機能しません。
Manページの重要な部分は次のとおりです。
転送するファイル/ディレクトリのリストが作成されると、rsyncは転送される各名前を包含/除外パターンのリストに対して順番にチェックし、最初に一致したパターンが処理されます:除外パターンの場合、そのファイルはスキップされました;包含パターンの場合、そのファイル名はスキップされません。一致するパターンが見つからない場合、ファイル名はスキップされません。
要約する:
また、スラッシュで終わるものはディレクトリと一致しています(find -type d
のように)。
この答えを上から引き離しましょう。
rsync -zarv --Prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
ファイルをスキップしないでください最後に、--Prune-empty-directories
は、最初のルールが場所全体に空のディレクトリを作成しないようにします。