我有一个用于同步源文件和测试文件的简单rsync
脚本:
rsync -a --include '*/' --include '*.hpp' --include '*.cpp' --include "Test/*" --exclude 'main.cpp' --exclude 'makefile' --exclude '*' --progress . somewhere/
虽然它正确地排除了makefile
,但它没有排除main.cpp
,同时执行此操作:
rsync -a --include '*/' --exclude 'main.cpp' --include '*.hpp' --include '*.cpp' --include "Test/*"--exclude 'makefile' --exclude '*' --progress . somewhere/
似乎有效。为什么?
来自手册页:
在构建要传输的文件/目录列表时,rsync依次根据包含/排除模式列表检查要传输的每个名称,并对第一个匹配模式执行操作:如果是排除模式,则跳过该文件;如果是include模式,则不跳过该文件名;如果没有找到匹配的模式,则不会跳过文件名。
因此,如果您希望排除main.cpp
,则需要先有一个与main.cpp
匹配的--exclude
模式,然后才有任何与之匹配的--include
模式。
如果您使用的是--filter
,同样适用于此。实际上,--include
和--exclude
只是某些类型的--filter
规则的简写。