第 5 章 - 文件过滤
第 5 章 - 文件过滤
5.1 过滤概述
Rclone 的过滤系统允许你精确控制哪些文件被包含或排除在操作之外。这对于以下场景至关重要:
- 备份时跳过临时文件和缓存目录
- 同步时只处理特定类型的文件
- 删除时只针对超过特定天数的文件
- 迁移时跳过大文件或小文件
过滤规则从上到下依次匹配,最后匹配的规则生效。
5.2 基本过滤参数
include / exclude
# 只包含 .jpg 文件
rclone copy src dst --include "*.jpg"
# 排除 .tmp 文件
rclone copy src dst --exclude "*.tmp"
# 多个规则组合
rclone copy src dst \
--include "*.jpg" \
--include "*.png" \
--exclude "*"
规则匹配语法
| 通配符 | 说明 | 示例 |
|---|---|---|
* | 匹配任意字符(不含 /) | *.jpg 匹配 photo.jpg |
** | 匹配任意字符(含 /) | **/cache/** 匹配任意深度的 cache 目录 |
? | 匹配单个字符 | file?.txt 匹配 file1.txt |
[abc] | 匹配括号内任一字符 | file[12].txt 匹配 file1.txt |
[a-z] | 匹配范围内的字符 | file[a-z].txt |
{a,b} | 匹配任一选项 | *.{jpg,png} 匹配 jpg 和 png |
匹配规则详解
# 匹配根目录下的文件
rclone copy src dst --include "/README.md"
# 匹配任意位置的文件
rclone copy src dst --include "README.md"
# 匹配目录
rclone copy src dst --include "/photos/"
# 匹配目录下的所有文件
rclone copy src dst --include "/photos/**"
# 排除隐藏文件
rclone copy src dst --exclude ".*"
# 排除特定目录
rclone copy src dst --exclude "/.git/**" --exclude "/node_modules/**"
5.3 过滤文件(Filter File)
对于复杂的过滤规则,可以将规则写入文件。
创建过滤文件
# filters.txt 内容:
# 排除临时文件
- *.tmp
- *.temp
- *.swp
# 排除版本控制目录
- .git/**
- .svn/**
# 排除编译产物
- node_modules/**
- __pycache__/**
- *.pyc
- build/**
- dist/**
# 排除系统文件
- .DS_Store
- Thumbs.db
- desktop.ini
# 只包含源代码文件
+ *.py
+ *.js
+ *.ts
+ *.go
+ *.java
+ *.rs
# 排除其他所有文件
- *
使用过滤文件
# 使用 --filter-from
rclone copy src dst --filter-from filters.txt
# 使用 --include-from / --exclude-from
rclone copy src dst --include-from includes.txt --exclude-from excludes.txt
过滤文件格式
# 注释行以 # 开头
# 空行被忽略
# + 表示包含(include)
+ *.jpg
+ *.png
+ /important/**
# - 表示排除(exclude)
- *.tmp
- /cache/**
# ! 表示清除之前的规则
!
# 从此处开始新的规则集
+ *.pdf
5.4 正则表达式过滤
使用 --filter 参数配合正则表达式:
# 使用正则表达式匹配文件名
rclone copy src dst --filter "+ re|^IMG_\\d{4}\\.jpg$|- *"
# 匹配日期格式的文件名
rclone copy src dst --filter "+ re|^\\d{4}-\\d{2}-\\d{2}\\.log$|- *"
# 排除以数字开头的目录
rclone copy src dst --filter "- re|^\\d+/.*"
正则表达式过滤语法
# 基本格式:--filter "+ regex|<pattern>|- <fallback>"
# 或使用 re: 前缀
# 匹配 .jpg 或 .png 文件
rclone copy src dst --include "re:.*\.(jpg|png)$"
# 匹配 2026 年的文件
rclone copy src dst --include "re:^2026.*"
# 匹配特定格式的日志文件
rclone copy src dst --include "re:access_\d{8}\.log"
5.5 按文件大小过滤
min-size / max-size
# 只传输大于 1MB 的文件
rclone copy src dst --min-size 1M
# 只传输小于 100MB 的文件
rclone copy src dst --max-size 100M
# 只传输 1MB 到 100MB 之间的文件
rclone copy src dst --min-size 1M --max-size 100M
# 删除小于 1KB 的文件
rclone delete remote:path --max-size 1K
大小单位
| 单位 | 说明 | 示例 |
|---|---|---|
B | 字节 | 100B |
K / KiB | 千字节(1024) | 1K |
M / MiB | 兆字节 | 16M |
G / GiB | 吉字节 | 1G |
T / TiB | 太字节 | 1T |
5.6 按文件日期/年龄过滤
min-age / max-age
# 只传输超过 30 天的文件
rclone copy src dst --min-age 30d
# 只传输最近 7 天内的文件
rclone copy src dst --max-age 7d
# 删除超过 90 天的日志
rclone delete s3:logs/ --min-age 90d --include "*.log"
# 只备份最近 24 小时修改的文件
rclone copy /data/ s3:backup/ --max-age 24h
时间单位
| 单位 | 说明 | 示例 |
|---|---|---|
s | 秒 | 60s |
m | 分钟 | 30m |
h | 小时 | 24h |
d | 天 | 30d |
w | 周 | 4w |
M | 月(30 天) | 6M |
y | 年(365 天) | 1y |
日期格式的 min-age / max-age
# 传输 2026-01-01 之后修改的文件
rclone copy src dst --min-age "2026-01-01"
# 传输 2026-05-01 之前修改的文件
rclone copy src dst --max-age "2026-05-01"
5.7 按文件名模式过滤
常见场景示例
# 只同步图片文件
rclone sync /photos/ s3:photos/ --include "*.{jpg,jpeg,png,gif,webp,svg}"
# 排除所有隐藏文件和目录
rclone copy src dst --exclude ".*" --exclude "*/.*"
# 排除特定目录
rclone copy src dst \
--exclude ".git/**" \
--exclude "node_modules/**" \
--exclude ".venv/**" \
--exclude "__pycache__/**" \
--exclude ".idea/**" \
--exclude ".vscode/**"
# 只复制配置文件
rclone copy src dst --include "*.{conf,cfg,ini,yaml,yml,toml,json}" --exclude "*"
# 排除大文件类型
rclone copy src dst --exclude "*.{iso,zip,tar,gz,7z,rar,mp4,avi}"
5.8 过滤规则优先级
规则从上到下匹配,最后匹配的规则生效(LIFO 顺序)。
示例 1:常见模式
# 先包含所有 .jpg 文件,再排除 thumbnail 目录下的,最后排除其他所有
rclone copy src dst \
--include "*.jpg" \
--exclude "/thumbnails/**" \
--exclude "*"
等价的过滤文件:
+ *.jpg
- /thumbnails/**
- *
示例 2:复杂项目同步
# filters.txt - 只同步源代码和文档
# 排除所有隐藏目录
- /**/.*/**
# 排除编译产物
- build/
- dist/
- out/
- target/
- *.o
- *.so
- *.dll
- *.exe
# 排除依赖目录
- node_modules/
- vendor/
- __pycache__/
- .venv/
# 排除临时文件
- *.tmp
- *.temp
- *.swp
- *.bak
- *~
- .DS_Store
- Thumbs.db
# 包含源代码
+ *.py
+ *.js
+ *.ts
+ *.jsx
+ *.tsx
+ *.go
+ *.rs
+ *.java
+ *.c
+ *.cpp
+ *.h
# 包含配置和文档
+ *.md
+ *.txt
+ *.yaml
+ *.yml
+ *.toml
+ *.json
+ *.xml
+ *.conf
+ Makefile
+ Dockerfile
+ .gitignore
# 包含必要的目录结构
+ */
# 排除其他所有文件
- *
使用:
rclone sync /projects/myapp/ s3:backup/myapp/ --filter-from filters.txt --progress
5.9 高级过滤技巧
5.9.1 –files-from — 只处理指定文件列表
# 先生成文件列表
rclone lsf s3:my-bucket/ --files-only > filelist.txt
# 只传输列表中的文件
rclone copy s3:my-bucket/ /local/ --files-from filelist.txt
5.9.2 –files-from-raw — 原始文件列表
# 文件列表中包含完整路径
echo -e "/data/file1.txt\n/data/file2.txt" > filelist.txt
rclone copy /data/ s3:bucket/ --files-from-raw filelist.txt
5.9.3 组合使用多种过滤
# 备份最近 7 天的、大于 1MB 的、非临时文件
rclone copy /data/ s3:backup/ \
--max-age 7d \
--min-size 1M \
--exclude "*.tmp" \
--exclude "*.temp" \
--exclude "/cache/**" \
--progress
5.9.4 清除规则
# 使用 --clear-filter 重置过滤规则
# 在过滤文件中使用 ! 清除之前的规则
# filters.txt:
# 包含所有 .py 文件
+ *.py
# 清除之前的规则
!
# 现在开始新的规则
+ *.js
- *
5.10 过滤调试
查看哪些文件被匹配
# 使用 --dump filters 查看过滤规则
rclone copy src dst --dump filters
# 使用详细模式查看匹配过程
rclone copy src dst --include "*.jpg" -vv 2>&1 | grep -E "(Match|Include|Exclude)"
测试过滤规则
# 使用 ls 命令测试过滤(不实际传输)
rclone ls src --include "*.jpg" --exclude "/cache/**"
# 使用 --dry-run 测试实际操作
rclone copy src dst --include "*.jpg" --dry-run -v
注意事项
⚠️ 规则顺序很重要:规则从上到下匹配,最后匹配的规则生效。确保
--exclude "*"在最后。
⚠️ 路径匹配:
--include "*.jpg"匹配所有目录下的 .jpg 文件。--include "/photos/*.jpg"只匹配根目录下 photos 目录的 .jpg 文件。
💡 性能提示:过滤规则越多,匹配越慢。尽量减少规则数量,使用高效的模式。
💡 安全做法:复杂过滤建议使用
--filter-from文件,并添加注释说明每条规则的用途。
💡 过滤文件版本控制:将过滤规则文件纳入版本控制,便于团队共享和复用。
扩展阅读
上一章:← 第 4 章 - 基本操作 下一章:第 6 章 - 数据同步 →