一、rsync文件过滤的基本玩法
rsync是个好东西,同步文件又快又稳,但有时候我们需要排除某些文件或目录,比如临时文件、日志文件或者编译产物。这时候--exclude参数就派上用场了。比如:
rsync -avz --exclude='*.log' /source/ user@remote:/destination/
(注释:这条命令会同步/source/目录下的所有文件,但跳过所有.log结尾的文件)
但问题来了:如果要排除的规则很多,比如几十种文件类型,难道要在命令行里写几十个--exclude?那也太麻烦了!
二、进阶玩法:--exclude-from参数
这时候--exclude-from就登场了。它的作用是从一个文件里读取排除规则,一行一条,干净利落。
假设我们有个文件exclude_rules.txt,内容如下:
# 排除日志文件
*.log
# 排除临时文件
*.tmp
# 排除隐藏文件
.*
# 排除特定目录
cache/
build/
然后这样用:
rsync -avz --exclude-from='exclude_rules.txt' /source/ user@remote:/destination/
(注释:--exclude-from指定了规则文件,rsync会逐行读取并应用这些规则)
三、规则文件的细节
规则文件支持通配符和路径匹配,比如:
*.log:排除所有.log文件temp/:排除所有名为temp的目录/error.log:只排除根目录下的error.log**/node_modules/:排除所有层级的node_modules目录
示例文件exclude_rules_advanced.txt:
# 排除所有编译产物
*.o
*.class
*.jar
# 排除版本控制目录
.git/
.svn/
# 排除特定路径的配置文件
/config/production.yml
四、结合其他参数使用
--exclude-from可以和其他过滤参数一起用,比如--include和--include-from。
假设我们想同步所有.txt文件,但排除其他文件:
rsync -avz --include='*.txt' --exclude-from='exclude_rules.txt' /source/ user@remote:/destination/
(注释:先包含.txt文件,再应用排除规则)
五、实际应用场景
- 备份网站数据:排除缓存和日志文件,只同步核心数据。
- 部署代码:排除开发环境的配置文件,避免覆盖生产配置。
- 同步开发环境:排除
node_modules和编译产物,节省时间和带宽。
六、技术优缺点
优点:
- 规则集中管理,易于维护
- 支持复杂匹配模式
- 可结合其他过滤参数灵活使用
缺点:
- 规则文件需要额外维护
- 复杂的规则可能导致性能略微下降
七、注意事项
- 规则顺序:rsync是按顺序应用规则的,写得太随意可能导致意外结果。
- 路径问题:规则文件里的路径是相对于源目录的,别搞错。
- 测试:先用
--dry-run测试,确认规则没问题再实际运行。
八、总结
--exclude-from是rsync过滤规则的利器,特别适合规则多、需要灵活控制的场景。掌握它,你的文件同步会更高效!
评论