一、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文件,再应用排除规则)

五、实际应用场景

  1. 备份网站数据:排除缓存和日志文件,只同步核心数据。
  2. 部署代码:排除开发环境的配置文件,避免覆盖生产配置。
  3. 同步开发环境:排除node_modules和编译产物,节省时间和带宽。

六、技术优缺点

优点

  • 规则集中管理,易于维护
  • 支持复杂匹配模式
  • 可结合其他过滤参数灵活使用

缺点

  • 规则文件需要额外维护
  • 复杂的规则可能导致性能略微下降

七、注意事项

  1. 规则顺序:rsync是按顺序应用规则的,写得太随意可能导致意外结果。
  2. 路径问题:规则文件里的路径是相对于源目录的,别搞错。
  3. 测试:先用--dry-run测试,确认规则没问题再实际运行。

八、总结

--exclude-from是rsync过滤规则的利器,特别适合规则多、需要灵活控制的场景。掌握它,你的文件同步会更高效!