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