在rsync中,如何排除所有与模式匹配的目录?


8

在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*可以添加其他名称的目录。我需要使脚本适应未来的需要,并在添加与模式匹配的目录时避免编辑脚本,因为这些目录可能是临时的。


您的排除参数可以。如果rsync在复制时忽略了branch *,则从dest中删除时也将忽略它,因此您必须在目标位置一次手动删除这些目录。
Ipor Sircer

目的地是一个新的空目录,由我的bash脚本创建。我确实从link-dest目录中删除了branch *目录,但无济于事。
Roger Creasy

1
你必须使用一个明确完整的图案像*branch*或者/root/branch*没有短branch*-短表中没有找到,因此不排除。
康提巴斯2016年

@Kondybas所以,除了我需要在我的排除分支前面加上“ *”之外,其他所有选项都可以吗?(--exclude '*branch*
Roger Creasy

Answers:


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

我将脚本中的选项更改为-avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNK“昨晚的备份”仍然备份了/ branch *目录。
Roger Creasy

1

rsync版本3.1.3(可能是更早的版本,尚未检查)使用此语法正确排除了子目录(显然替换exclude_dirname为您要排除的模式):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

这也适用于通配符。原始问题使用'branch*',因此这可行:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.