![在 rsync 中,如何排除所有符合模式的目录?](https://linux22.com/image/689607/%E5%9C%A8%20rsync%20%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8E%92%E9%99%A4%E6%89%80%E6%9C%89%E7%AC%A6%E5%90%88%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
在 rsync 中,我尝试排除与模式匹配的子目录。但是,我无法让它工作。我按照这里和 Google 上找到的几个示例进行了操作。但是,我没有得到正确的结果。这是我的命令的选项位:
-avh --exclude 'branch*' --stats --delete --link-dest=$LNK
我的源目录结构是
/root
/branch1
/branch2
/branch3
/other
/stillAnother
/etc
这是备份脚本的一部分。$LNK 是前一天 rsync 目标的链接。
我不希望 /root/branch1、/root/branch2、/root/branch3 或它们的内容被同步。但是,它们被同步了。
以下是我已经尝试过的排除位:
--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*
谢谢您的帮助/建议。
编辑-解决“可能重复”标志
这个问题是关于已知目录列表的。我需要排除任何遵循某种模式的目录,即使这些目录尚不存在。即从我的示例来看,/branch*
可能会添加其他命名的目录。我需要使我的脚本面向未来,并避免在添加与模式匹配的目录时编辑脚本,因为这些目录可能是临时的。
答案1
rsync 版本 3.1.3(可能更早,尚未检查)使用此语法正确排除子目录(显然exclude_dirname
用您想要排除的模式替换):
rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/
这也适用于通配符。原始问题使用'branch*'
,因此这有效:
rsync [other opts...] --exclude='*/branch*/' /src/ /dst/
希望这可以帮助。
答案2
您的排除规则是正确的。但是,如果没有额外的参数,rsync 将不会删除目标上排除的文件--delete-excluded
:
--delete-excluded also delete excluded files from dest dirs
例子:
# tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other
# tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other
# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/
sent 140 bytes received 27 bytes 334.00 bytes/sec
total size is 0 speedup is 0.00
# tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other
3 directories, 1 file