![如何使用 rsync 从目录树中包含文件子集?](https://linux22.com/image/723171/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20rsync%20%E4%BB%8E%E7%9B%AE%E5%BD%95%E6%A0%91%E4%B8%AD%E5%8C%85%E5%90%AB%E6%96%87%E4%BB%B6%E5%AD%90%E9%9B%86%EF%BC%9F.png)
我正在使用 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)
$