如何使用 rsync 从目录树中包含文件子集?

如何使用 rsync 从目录树中包含文件子集?

我正在使用 rsync 备份整个卷的大部分内容,希望省略 OS X 开销文件和与一堆虚拟机相关的大部分文件。

忽略开销文件是可行的。我遇到麻烦的是 VM 文件。

所有虚拟机都位于以 /VirtualMachines/ 开始的目录树中。虚拟机位于顶层和各级子目录中。我只想保留虚拟机配置文件(.vmx、.vmxf 和 .plist),并跳过其余文件(虚拟磁盘等)。

到目前为止,我还没有让它工作。我看到了三种结果:
- 我得到了所有 VM 文件
- 我没有得到 VM 文件
- 我得到了我想要的文件,但只来自顶层

这是我当前的脚本:

#!/usr/bin/env bash
rsync \
  -vv \
  --dry-run \
  --stats \
  --human-readable \
  --archive \
  --acls \
  --executability \
  --owner \
  --group \
  --hard-links \
  --numeric-ids \
  --perms \
  --xattrs \
  --filter="exclude /.DocumentRevisions*" \
  --filter="exclude .DS_Store" \
  --filter="exclude /.fseventsd" \
  --filter="exclude /.Spotlight*" \
  --filter="exclude /.TemporaryItems" \
  --filter="exclude /.Trash*" \
  --filter="exclude /.VolumeIcon*" \
  --filter="exclude /.disk_label*" \
  --filter="include /VirtualMachines/**.vmx" \
  --filter="include /VirtualMachines/**.vmxf" \
  --filter="include /VirtualMachines/**.plist" \
  --filter="exclude /VirtualMachines" \
  /Volumes/Data02/ /Volumes/Data03/Backups/Rsync/dpconsulting.dpc/Data02

它没有返回任何 VM 文件。

据我了解,rsync 使用第一个匹配的规则,因此包含的规则应该优先于最后的排除规则。

我显然误解了一些东西,但重新阅读 rsync 文档并阅读大量谷歌搜索结果并没有提供任何澄清。

我错过了什么?
TIA

答案1

我会用--include和/或--exclude代替--filter,但是你确实提到你想走另一条路,如果那是你想走的路,那么你应该做man rsync并搜索FILTER RULES,然后阅读一些内容......

这是工作示例:

$ touch 1 2
$ mkdir 3
$ rsync -rnv --filter "- 1" ./ ./3/
sending incremental file list
2
3/

sent 90 bytes  received 23 bytes  226.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
$ 

相关内容