强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 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

时间单位

单位说明示例
s60s
m分钟30m
h小时24h
d30d
w4w
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 章 - 数据同步 →