--exclude参数用于在 rsync 命令中排除指定的目录/文件, 在使用这个参数时有几个要注意的地方, 最重要的一点在于--exclude的路径逻辑问题.
在考虑--exclude的路径之前, 要先搞清楚 rsync 本身的同步路径逻辑, 以下命令:

rsync -av src dest

会将当前目录下的 src目录/文件同步到 dest/src 目录/文件, 也就是说, 在直接指定目录/文件的情况下, rsync 认为工作路径位于该目录/文件所属的目录.
也许你觉得这样不太符合逻辑, 那么看以下命令:

rsync -av src1 src2 dest

以上命令是合法的, 因为 rsync 支持一次性同步多个目录 / 文件, 如果是直接覆盖的话, 那么同步后 dest 应该是 src1 的内容还是 src2 的内容呢? 以 rsync 正确的逻辑, src1 和 src2 目录 / 文件会被并列放在 dest 目录下, 就显得更为合理.
要同步一个目录下的所有文件, 应该使用:

rsync -av src/ dest

这样才是将 src 直接拷贝到 dest 目录.
当然, 如果用rsync -av src1/ src2/ dest这种奇怪的方式去同步的话, dest 的内容将是多个目录内容的叠加, 重名的文件将以最后一个目录 / 文件为准.
然后,--exclude参数指定的路径是相对于工作目录的路径, 比如以下命令:

rsync -av --exclude local src dest

排除的是当前目录下的 local 目录 / 文件, 而同步的只有当前目录下的 src 目录 / 文件, 相当于这个--exclude完全无效.
再看以下命令:

rsync -av --exclude local src/ dest

这样才是成功排除了 src/local 这个目录 / 文件.
要注意:

rsync -av --exclude src/local src/ dest

这样实际上排除的是 src/src/local 目录 / 文件.
同样, 如果用rsync -av --exclude local src1/ src2/ dest这样奇怪的方式同步的话, 被排除的有 src1/local 和 src2/local 两个目录 / 文件.

本文转载自:https://wujunchao.com/blog/p/1172