Rclone的通配符语法和其他工具的通配符语法有什么区别?
美国、香港服务器
Rclone的通配符语法和其他工具的通配符语法有什么区别?
12-04 来源:
Rclone 的通配符语法虽基于通用 glob 规则,但为适配「跨平台文件同步 / 云存储场景」做了专属设计,与 Shell(Bash/Zsh)、Git、rsync、find 等工具的通配符核心差异体现在层级匹配、路径处理、语法支持范围上,以下是具体对比和关键区别点:
一、核心通配符语法对比表
通配符 / 语法规则 Rclone Shell(Bash/Zsh) rsync Git(.gitignore) find
* 匹配当前层级任意字符(不含 /),仅匹配文件 / 目录名,不跨层级 同 Rclone,但可通过 shopt -s globstar 扩展 同 Rclone 同 Rclone 匹配任意字符(不含 /),需结合 -name
** 核心:匹配任意层级的目录 / 文件(含 /),支持递归(如 tmp/** 匹配 tmp 下所有内容) 默认不支持,需开启 globstar 后才支持(如 **/*.log) 支持,但需加 --recursive 生效 核心:匹配任意层级(如 **/tmp 匹配所有 tmp 目录) 不支持,需用 -type d -name tmp -prune 实现递归排除
? 匹配单个任意字符(不含 /),无差异 同 Rclone 同 Rclone 同 Rclone 同 Rclone
[] 支持字符范围(如 file[1-3].txt),无差异 同 Rclone 同 Rclone 同 Rclone 同 Rclone,但需加引号避免 Shell 解析
/(路径限定) 以 / 开头 = 基于「同步源目录」的绝对路径(如 /data/*.log 仅匹配源目录 /data/ 下的 log);不以 / 开头 = 相对路径 以 / 开头 = 系统根目录(如 /data/*.log 匹配系统 /data/);不以 / 开头 = 当前工作目录 同 Shell,基于执行目录的绝对 / 相对路径 以 / 开头 = 仓库根目录;不以 / 开头 = 任意层级 以 / 开头 = 系统根目录;不以 / 开头 = 当前目录
大小写敏感 默认敏感,可通过 --ignore-case 全局忽略 取决于系统(Linux 敏感,mac/Windows 可配置) 默认敏感,无全局忽略参数 默认敏感,可通过 core.ignorecase 配置 默认敏感,需加 -iname 忽略
规则优先级 包含规则(--include)> 排除规则(--exclude),更具体的规则优先 无优先级,按匹配结果执行 排除规则(--exclude)> 包含规则(--include) 从上到下匹配,先定义的规则优先 无优先级,按过滤条件组合执行
二、关键差异点详解
1. 最核心差异:** 的语义和默认支持
这是 Rclone 与多数工具最直观的区别:
Rclone:** 是「原生支持」的递归匹配符,无需额外配置,tmp/** 直接匹配 tmp/ 下所有层级的文件 / 目录(如 tmp/a.txt、tmp/sub/b.log),是同步场景的核心语法;
Shell(Bash):默认不支持 **,需手动开启 shopt -s globstar 才能实现递归匹配,否则 ** 仅等价于 *;
rsync:支持 **,但需配合 --recursive(-r)参数才生效,且 ** 仅匹配目录层级;
Git(.gitignore):** 是核心语法,与 Rclone 类似,但更侧重「目录排除」(如 **/node_modules 排除所有 node_modules 目录)。
2. 路径限定(/)的语义差异
Rclone 的路径是「相对同步源目录」的,而非系统根目录,这是适配云存储 / 跨路径同步的关键设计:
示例:执行 rclone sync /data alioss:backup --include "/data/*.log"
Rclone:/data/*.log 中的 / 是「同步源目录 /data 的根」,实际匹配 /data/*.log(源目录下的 log 文件);
Shell/rsync:/data/*.log 中的 / 是「系统根目录」,匹配 /data/ 下的 log 文件(看似结果一致,但逻辑不同);
若 Rclone 同步源是 ~/docs,则 --include "/docs/*.txt" 等价于匹配 ~/docs/*.txt,而非系统 /docs/*.txt。
3. 规则优先级与组合逻辑
Rclone:「包含规则优先于排除规则」,且「更具体的规则优先」(如 /data/test.log 优先于 *.log);
示例:--include "*.log" --exclude "tmp/*.log" → 会保留所有 log,仅排除 tmp 下的 log;
rsync:「排除规则优先于包含规则」,逻辑相反;
示例:rsync --include "*.log" --exclude "tmp/*.log" /data/ remote:/backup → 会因排除规则优先级更高,导致 tmp 下的 log 被排除,其他 log 也可能被兜底排除;
Git:规则按「从上到下」匹配,先定义的规则生效(如先写 *.log 排除所有 log,再写 !app.log 例外保留 app.log)。
4. 场景适配差异(Rclone 专属)
Rclone 通配符语法围绕「文件同步 / 云存储」设计,有专属适配:
支持「目录 vs 文件」精准区分:--exclude "tmp/" 仅排除 tmp 目录(而非 tmp 文件),Shell/rsync 需额外处理;
支持「预演验证」:--dry-run 可预览通配符匹配结果,这是同步场景避免数据丢失的核心功能,其他工具(如 rsync)虽也支持 --dry-run,但无 Rclone 针对过滤的精准提示;
支持「批量规则文件」:--filter-from 可读取包含 / 排除规则文件,语法与 Git .gitignore 类似,但 +/- 替代了 Git 的 !/ 默认排除。
三、常见工具通配符迁移到 Rclone 的注意事项
1. 从 Shell 迁移
去掉 Shell 通配符的转义(如 \* → *),Rclone 无需转义;
若用 ** 递归匹配,无需开启 globstar,直接使用 **;
路径中的 / 改为「相对同步源目录」的路径(而非系统绝对路径)。
2. 从 Git .gitignore 迁移
Git 的 *.log → Rclone 的 --exclude "*.log";
Git 的 !app.log(例外)→ Rclone 的 --include "app.log";
Git 的 **/tmp → Rclone 的 --exclude "**/tmp/**"(需加 /** 匹配目录下所有内容)。
3. 从 rsync 迁移
反转包含 / 排除规则的顺序(Rclone 包含优先,rsync 排除优先);
rsync 的 --exclude-from → Rclone 的 --exclude-from(语法兼容,但优先级不同);
去掉 rsync 的 --recursive,Rclone 同步默认递归,** 原生支持。
四、典型场景对比示例
需求 Rclone 命令 Bash 命令 Git .gitignore 规则 rsync 命令
排除所有 tmp 目录下的 log rclone sync /data oss:backup -P --exclude "tmp/**/*.log" ls /data/tmp/**/*.log(需开启 globstar) tmp/**/*.log rsync -r --exclude "tmp/**/*.log" /data/ remote:/backup
仅保留 conf 和 sql 文件 rclone sync /data oss:backup -P --include "*.conf" --include "*.sql" --exclude "*" 无直接等价(需组合 find) 无(gitignore 是排除逻辑) rsync -r --include "*.conf" --include "*.sql" --exclude "*" /data/ remote:/backup
排除隐藏文件(. 开头) rclone sync /data oss:backup -P --exclude "**/.*" ls !(*.)(需 extglob) .* rsync -r --exclude ".*" /data/ remote:/backup
总结
Rclone 通配符语法的核心特点是:原生支持递归 **、路径基于同步源目录、包含规则优先、适配文件同步场景的精准过滤,与 Shell/rsync/Git 的差异本质是「场景适配不同」—— Rclone 为跨平台 / 云存储同步设计,其他工具则围绕「本地文件操作 / 版本控制」设计。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快