You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rsync基于通配符跳过指定文件夹的rsync-backup.sh修改方法

实现方法

你之前使用的大括号传参写法不生效原因很明确:

  1. 当前运行环境的shell是ash(即脚本指定的/bin/sh,Alpine/BusyBox默认shell),不支持bash/zsh的大括号展开语法
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:39:15