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


14

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

这是我尝试过的:

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

但这是行不通的。

我想念什么?

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


为什么需要初始字母--include='*/'
查理·帕克

1
如果我有递归目录,而我只想发送一种类型的文件,那么该命令将如何处理。似乎仅对目标目录执行此操作,可能是因为最后一个排除项将所有内容排除在外
Charlie Parker

Answers:


17

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

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

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


大!谢谢!就我的理解而言,我们为什么需要--include='*/'--exclude='*'?为什么只--exclude=venv/ --include='*.py'行不通?
CentAu

1
@CentAu我通过讨论更新了答案。
John1024'9

如果我有递归目录,而我只想发送一种类型的文件,那么该命令将如何处理。似乎仅对目标目录执行此操作,可能是因为最后一个excludes排除了所有内容。
查理·帕克

1
收藏!特别是对于微妙之处。我想不出任何其他的CLI实用程序,这些标志的顺序都至关重要
antortjim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.