在rsync中包含与其他排除在外的同名文件夹

Include folder with same name that other in exclude in rsync

所以我有这个代码:

rsync \
   --archive \
   --verbose \
   --compress \
   --delete \
   --no-motd \
   --exclude=.git* \
   --exclude=.idea \
   --exclude=.tags \
   --exclude=vendor \
   --exclude=tags \
   --exclude=node_modules \
   --rsync-path="sudo rsync" \
   "${src}"/ \
   "${profile}":"${dst}"

而且效果很好!但是我有一个问题......这个树结构:

.
├── app
│   ├── vendor/
├── vendor/

它不起作用。我只想排除 ./vendor 但包括 ./app/vendor。我试过 --include 但结果是一样的: app/vendor 总是被排除在外。

有两种方法可以做到这一点:

  1. --include:

    rsync \
       .... \
       --include=app/vendor \
       --exclude=vendor \
       ....
    

    即将 --include 放在 之前 --exclude

  2. 更具体--exclude:

    rsync \
        .... \
        --exclude=/vendor \
        ....
    

    即仅排除源目录根目录中的 vendor(不要与文件系统根目录混淆)。

include/exclude 规则的基本规则是 rsync 将使用匹配任何给定文件的 first 规则。您将特定规则放在顶部,将一般规则放在底部。如果你把它们倒过来,你会发现你的特定覆盖不起作用。