在 rsync 中,如何排除所有符合模式的目录?

在 rsync 中,如何排除所有符合模式的目录?

在 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

相关内容