次の bash スクリプトを使用して、特定の拡張子 (この場合は *.sh) のファイルのみをコピーしますが、それでもすべてのファイルをコピーします。どうしたの?
from=$1 へ=$2 rsync -zarv --include="*.sh" $from $to
は、それらのファイルのみを含めるのではなく、--include
そうでなければ によって除外されるファイルのサブセットを含めるために使用されると思います。--exclude
言い換えれば、除外しない意味を含めることを考える必要があります。
代わりに試してください:
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"
マニュアルページの重要な部分は次のとおりです。
転送するファイル/ディレクトリのリストが作成されると、rsync は転送される各名前を包含/除外パターンのリストと照合して順番にチェックし、最初に一致したパターンが処理されます。除外パターンの場合、そのファイルはスキップされました。インクルード パターンの場合、そのファイル名はスキップされません。一致するパターンが見つからない場合、ファイル名はスキップされません。
要約する:
また、スラッシュで終わるものはディレクトリに一致しています ( find -type d
would のように)。
この答えを上から引き離しましょう。
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
ファイルをスキップしない最後に、--prune-empty-directories
最初のルールが空のディレクトリをあちこちに作成しないようにします。
もう1つ追加:1つのディレクトリのみ(再帰なし)で拡張子ごとにファイルを同期する必要がある場合は、次のような構成を使用する必要があります。
rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/
最初の のドットに注意してください--include
。--no-r
この構造では機能しません。
編集:
貴重なコメントをくださった gbyte.co に感謝します。
編集:
フラグはこの-uzv
質問とは直接関係ありませんが、普段使用しているので含めました。
誰かがこれを探したら…特定のファイルとフォルダーのみを再同期したかったのですが、次のコマンドでそれを実行できました。rsync --include-from=rsync-files
rsync ファイルを使用する場合:
my-dir/
my-file.txt
- /*