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

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

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

这是我尝试过的:

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

但这不起作用。

我缺少什么?

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

答案1

venv/需要排除 */已经包括了:

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

微妙之处在于rsync按顺序处理规则,第一个匹配的规则获胜。因此,如果--include='*/'is 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='*/'确保探索所有目录的内容。

相关内容