![Rsync,仅包含某些文件类型,不包括某些目录](https://linux22.com/image/93863/Rsync%EF%BC%8C%E4%BB%85%E5%8C%85%E5%90%AB%E6%9F%90%E4%BA%9B%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B%EF%BC%8C%E4%B8%8D%E5%8C%85%E6%8B%AC%E6%9F%90%E4%BA%9B%E7%9B%AE%E5%BD%95.png)
我只想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='*/'
确保探索所有目录的内容。