Rsync、一部のディレクトリを除く特定のファイルタイプのみを含める


14

特定のファイルタイプのみ(例:)をrsyncし.py、一部のディレクトリ(例:)のファイルを除外したいvenv

これは私が試したものです:

rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

しかし、それは機能しません。

何が欠けていますか?

また、私は答えに続くこの質問に、それは助けにはなりませんでした。


なぜイニシャルが必要なの--include='*/'ですか?
チャーリーパーカー

1
1種類のファイルのみを送信したい再帰ディレクトリがある場合、コマンドはどのように作成されますか?唯一のものを除くすべて除外おそらく最後のターゲットディレクトリのためにそれをしないようだ
チャーリー・パーカー

回答:


17

venv/を含める に除外する必要があります*/

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

巧妙なのは、rsyncルールを順番に処理し、最初に一致したルールが優先されることです。したがって、--include='*/'がbeforeの場合--exclude='venv/'、ディレクトリvenv/はに含まれ--include='*/'、除外ルールは参照されません。

これを簡略化できますか?

なぜ我々は必要なのですか--include='*/'--exclude='*'?なぜ--exclude=venv/ --include='*.py'十分ではないのですか?

デフォルトでは、ファイル/ディレクトリが含まれます。それで、考慮してください:

rsync -avz --exclude='venv/' --include='*.py' source target

これには、の下のファイルまたはディレクトリを除くすべてが含まれvenv/ます。ただし、必要なのは.pyファイルだけです。つまり、で他のファイルを明示的に除外する必要があります--exclude='*'

--exclude='*'ファイルとディレクトリの両方を除外ます。したがって、を指定する--exclude='*'と、すべてのディレクトリが除外され.py、ルートディレクトリにあるファイルのみが検索されます。 は除外されるディレクトリを調べない.pyため、サブディレクトリ内のファイルは決して見つかりrsyncません。したがって、がある場合は、すべてのディレクトリのコンテンツが確実に探索されるように、その--exclude='*'前に置く 必要があり--include='*/'ます。


すごい!ありがとう!ただ、私の理解のために、なぜ我々は必要なのですか--include='*/'--exclude='*'?なぜ--exclude=venv/ --include='*.py'機能しないのですか?
CentAu

1
@CentAu私はそれについての議論で答えを更新しました。
John1024 2016

1種類のファイルのみを送信したい再帰ディレクトリがある場合、コマンドはどのように作成されますか?おそらくすべてを除外する最後の除外のために、ターゲットディレクトリに対してのみそれを行うようです。
チャーリーパーカー

1
ブックマーク!特に微妙です。フラグの順序が問題となる他のCLIユーティリティは考えられません!
antortjim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.