Rsync,仅包含某些文件类型,不包括某些目录

Cen*_*tAu 17 rsync file-copy

我只想 rsync 某些文件类型(例如.py)并且我想排除某些目录中的文件(例如venv)。

这是我尝试过的:

rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

我错过了什么?

我也遵循了这个问题的答案,但没有帮助。

Joh*_*024 26

venv/ */包含之前需要排除:

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Run Code Online (Sandbox Code Playgroud)

微妙之处在于rsync按顺序处理规则,第一个匹配的规则获胜。因此,如果--include='*/'是 before --exclude='venv/',则目录venv/被包含在--include='*/'并且从不咨询排除规则。

我们可以简化一下吗?

为什么我们需要--include='*/'--exclude='*'?为什么--exclude=venv/ --include='*.py'不够?

默认是包含文件/目录。因此,请考虑:

rsync -avz --exclude='venv/' --include='*.py' source target
Run Code Online (Sandbox Code Playgroud)

这将包括除venv/. 但是,您只需要.py文件。这意味着我们必须明确排除其他带有--exclude='*'.

--exclude='*'排除这两个文件和目录。因此,如果我们指定--exclude='*',则将排除所有目录,并且只会.py找到根目录中的文件。 .py永远不会找到子目录中的文件,因为rsync不会查看排除的目录。因此,如果我们有 --exclude='*',我们需要在它之前--include='*/'确保所有目录的内容都被探索。