web-dev-qa-db-ja.com

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

特定のファイルタイプのみをrsyncしたい(例:.py)と私はいくつかのディレクトリ(例えばvenv)のファイルを除外したいと思います。

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

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

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

何が欠けていますか?

私も この質問 への回答に従いましたが、役に立ちませんでした。

14
CentAu

venv/は除外する必要がありますbefore*/が含まれています:

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

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

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

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

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

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

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

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

17
John1024