rsync根据--exclude位置排除文件



我有一个用于同步源文件和测试文件的简单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规则的简写。

最新更新