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

Rog*_*asy 8 linux rsync

在 rsync 中,我试图排除与模式匹配的子目录。但是,我无法让它工作。我遵循了在这里和谷歌上找到的几个例子。但是,我没有得到正确的结果。这是我的命令的选项位:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK
Run Code Online (Sandbox Code Playgroud)

我的源目录结构是

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc
Run Code Online (Sandbox Code Playgroud)

这是备份脚本的一部分。$LNK 是指向前一天 rsync 目标的链接。

我不想要 /root/branch1、/root/branch2、/root/branch3。或要同步的内容。但是,他们是。

以下是我已经尝试过的排除位:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助/建议。

编辑 - 解决“可能重复”标志

这个问题是关于一个已知的目录列表。我需要排除任何遵循某种模式的目录,即使这些目录尚不存在。即从我的示例中,/branch*可以添加其他命名的目录。我需要使我的脚本面向未来,并避免在添加与模式匹配的目录时编辑脚本,因为这些目录可能是临时的。

小智 11

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

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/
Run Code Online (Sandbox Code Playgroud)

这也适用于通配符。原始问题使用'branch*',所以这有效:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


M. *_*tki 5

您排除的规则是正确的。但是,如果没有额外的参数,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
Run Code Online (Sandbox Code Playgroud)