Rsync基于通配符跳过指定文件夹的rsync-backup.sh修改方法
实现方法
你之前使用的大括号传参写法不生效原因很明确:
- 当前运行环境的shell是ash(即脚本指定的
/bin/sh,Alpine/BusyBox默认shell),不支持bash/zsh的大括号展开语法 - rsync的
--exclude参数不支持单参数传多个匹配模式,每个排除规则需要单独声明,或通过规则文件批量导入
规则匹配说明
你需要跳过的三个路径,对应rsync排除规则如下(规则路径是相对于你传入的同步源$1的相对路径,若同步源为系统根目录/可直接使用):
home/forge/*/storage/framework/cache/***:匹配所有forge用户目录下缓存目录下的任意层级内容home/forge/*/vendor/:匹配所有forge用户目录下的vendor依赖文件夹home/forge/*/node_modules/:匹配所有forge用户目录下的node_modules依赖文件夹
注意:如果你传入的同步源不是根目录,比如源为
/home/,需要去掉规则前缀的home/,否则规则无法命中。
修改后的完整脚本
保留原脚本所有原有逻辑,仅新增排除规则配置,修改后代码如下:
#!/bin/sh # Usage: rsync-backup.sh <src> <dst> <label> if [ "$#" -ne 3 ]; then echo "$0: Expected 3 arguments, received $#: $@" >&2 exit 1 fi # 基础同步参数 + 固定排除规则,后续新增排除项直接在下方追加--exclude即可 RSYNC_BASE="-azP \ --exclude='home/forge/*/storage/framework/cache/***' \ --exclude='home/forge/*/vendor/' \ --exclude='home/forge/*/node_modules/' " if [ -d "$2/__prev/" ]; then rsync $RSYNC_BASE --delete --link-dest="$2/__prev/" "$1" "$2/$3" else rsync $RSYNC_BASE "$1" "$2/$3" fi rm -f "$2/__prev" ln -s "$3" "$2/__prev"
补充说明
- 规则中使用的
***是rsync专属通配符,可匹配任意深度的文件、目录,比单*匹配更全面,能确保缓存目录下所有层级内容都被跳过 - 如果后续需要添加的排除规则包含空格、特殊字符,可改用
--exclude-from参数:将所有排除规则逐行写入一个纯文本文件,rsync命令中追加--exclude-from=/path/to/your/exclude-rules.txt即可,能避免shell转义导致的规则失效问题
内容的提问来源于stack exchange,提问作者user1469734
相关产品推荐
相关产品推荐

