特定のファイルタイプのみ(例:)をrsyncし.py、一部のディレクトリ(例:)のファイルを除外したいvenv。
これは私が試したものです:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
しかし、それは機能しません。
何が欠けていますか?
また、私は答えに続くこの質問に、それは助けにはなりませんでした。
特定のファイルタイプのみ(例:)をrsyncし.py、一部のディレクトリ(例:)のファイルを除外したいvenv。
これは私が試したものです:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
しかし、それは機能しません。
何が欠けていますか?
また、私は答えに続くこの質問に、それは助けにはなりませんでした。
回答:
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'機能しないのですか?
--include='*/'ですか?