153

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

from=$1
へ=$2

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

6 に答える 6

262

は、それらのファイルのみを含めるのではなく、--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 ページのパターン ルールを含める/除外するセクションで、いくつかの良い例を見つけることができます。

于 2012-06-20T01:48:42.093 に答える
75

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

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
于 2015-09-11T15:42:29.830 に答える
30

マニュアルページの重要な部分は次のとおりです。

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

要約する:

  • どのパターンとも一致しない場合、ファイルがコピーされます!
  • いずれかのパターンが一致すると、アルゴリズムは終了します

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

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

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

最後に、--prune-empty-directories最初のルールが空のディレクトリをあちこちに作成しないようにします。

于 2018-07-23T13:55:03.183 に答える
19

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

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

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

編集:

貴重なコメントをくださった gbyte.co に感謝します。

編集:

フラグはこの-uzv質問とは直接関係ありませんが、普段使用しているので含めました。

于 2014-02-17T13:32:16.010 に答える
0

誰かがこれを探したら…特定のファイルとフォルダーのみを再同期したかったのですが、次のコマンドでそれを実行できました。rsync --include-from=rsync-files

rsync ファイルを使用する場合:

my-dir/
my-file.txt

- /*
于 2020-04-11T19:39:46.623 に答える