rsync过滤目录异常:指定排除的f开头目录仍被同步复制
问题描述
目录结构如下:
f001 pics 2015/... f002 pics 2016/... f003 pics 2017/... f004 pics 2018/... f005 pics 2019/... f006 pics 2020/... f007 pics 2021/... f008 pics 2022/... j001 pics 2020/... j002 pics 2021/... j003 pics 2022/... r001 pics 2020/... r002 pics 2021/... r003 pics 2022/... t001 pics 2020/... t002 pics 2021/... t003 pics 2022/...
所有文件夹包含大量图片,且会频繁新增,现有数百个。需求为:仅复制以f开头的文件夹及其内容,但排除f001、f002、f003、f006、f007、f011目录。
执行的rsync命令:
rsync -avtP --filter="+ /f*/" --filter="- /f001*/" --filter='- /f002*/' --filter='- /f003*/' --filter='- /f006*/' --filter='- /f007*/' --filter='- /f011*/' --filter='- *' "/data/source/" /data/destination/
当前问题:非f开头的文件夹已被过滤,但f001等需排除的目录仍被复制。
解决方法
rsync的过滤规则按匹配顺序生效,一旦某条规则匹配成功,后续规则不再执行。原命令中+ /f*/优先匹配所有f开头目录(包括需排除的目标),导致后续排除规则无法触发,因此这些目录被复制。
正确做法是先排除特定f开头目录,再允许所有f开头目录,最后排除其他内容,修正后的命令:
rsync -avtP \ --filter="- /f001/" \ --filter="- /f002/" \ --filter="- /f003/" \ --filter="- /f006/" \ --filter="- /f007/" \ --filter="- /f011/" \ --filter="+ /f*/" \ --filter="- *" \ "/data/source/" /data/destination/
说明:规则中的/用于明确匹配目录,避免误匹配同名文件;拆分多行是为了可读性,实际执行也可以写在一行。
内容的提问来源于stack exchange,提问作者eyesound
相关产品推荐
相关产品推荐

