rsync - 排除除子目录之外的所有内容,但排除子子目录

rsync - exclude everything except a subdir, but exclude a sub subdir

我正在尝试将远程目录同步到本地,我想排除除子目录之外的所有内容。但是那个子目录里面有一个我想排除的子目录。我的理解是 rsync 在排除之后应用包含,我试图在这里找出必要的模式。这些是我传递的 include/exclude 标志:

rsync -Pav -e "ssh -i /path/to/key.pem" \
  --include="subdir/***" \
  --exclude="subdir/subsubdir" \
  --exclude="*" \
  remote@address.com:/path/to/remote/dir/ \
  /path/to/local/dir/

编辑:目前这导致 rsync 抓取子目录内的所有内容,包括我试图排除的子目录。

谢谢!

我关于 rsync 如何应用过滤器的假设被误传了。 @meuh 留下了正确答案的评论:

rsync applies the filters in the order you give them, so try the subsub exclude before the include.

我还必须在我的排除项中添加尾部斜杠。这是正确的 rsync 命令:

rsync -Pav -e "ssh -i /path/to/key.pem" \
  --exclude="subdir/subsubdir/" \
  --include="subdir/***" \
  --exclude="*" \
  remote@address.com:/path/to/remote/dir/ \
  /path/to/local/dir/

下面是命令 运行 在本地的演示:

rsync -Pav \
  --exclude="subdir/subsubdir/"
  --include="subdir/***" \
  --exclude="*" \
  ./remote/ \
  ./local/

之前:

.
├── local
└── remote
    ├── subdir
    │   ├── subsubdir
    │   │   └── test.txt
    │   └── test.txt
    └── test.txt

之后:

.
├── local
│   └── subdir
│       └── test.txt
└── remote
    ├── subdir
    │   ├── subsubdir
    │   │   └── test.txt
    │   └── test.txt
    └── test.txt