我只想 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='*/'
确保所有目录的内容都被探索。