特定のファイルタイプのみ(例:)を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='*/'
ですか?