使用rsync复制不含文件及隐藏目录的目录树失败,求原因与解决方案
问题原因与解决方案
失败原因
rsync的匹配规则是按顺序生效的,当规则冲突时,先匹配到的规则优先级更高。你原来的命令里:
- 先执行
--include '*/',这条规则会匹配所有目录(包括.hidden、a/.hidden这类隐藏目录),一旦匹配成功,后续的--exclude '.*/'就不会再对这些目录生效。 - 后续的排除规则根本没机会处理已经被
include选中的隐藏目录,所以隐藏目录仍会被复制。
正确解决方案
调整规则顺序,先排除所有隐藏目录,再包含非隐藏目录,最后排除所有文件,确保隐藏目录在被include之前就被排除。执行以下命令:
rsync -av --exclude '.*/' --include '*/' --exclude '*' src/ dst/
规则解释
--exclude '.*/':递归排除所有隐藏目录(包括嵌套在非隐藏目录里的隐藏子目录)--include '*/':包含所有未被排除的非隐藏目录,保证目录结构可递归复制--exclude '*':排除所有文件,确保不会复制任何文件
模拟验证(可选)
如果需要确认规则效果,可添加--dry-run参数做模拟运行,不会实际修改文件:
rsync -av --dry-run --exclude '.*/' --include '*/' --exclude '*' src/ dst/
内容的提问来源于stack exchange,提问作者dastrobu
相关产品推荐
相关产品推荐

