过滤,包含和排除规则

Rclone有一套复杂的包含和排除规则。其中一些基于模式,一些基于文件大小等其他内容。

该过滤器被应用在copy,sync,move,ls,lsl, md5sum,sha1sum,size,delete和check操作。请注意,purge不适用于过滤器。

通过 rclone 的每个路径都与包含和排除规则匹配, 如
–include,–exclude,–include-from, –exclude-from,–filter,或–filter-from。尝试它们的最简单方法是使用 ls 命令, 或者–dry-run和v 一起运行。

模式

这个模式用于匹配基于 unix shell 使用的 “文件全局”的包含或排除文件。

如果模式以/开头,则它仅匹配目录树的顶层,相对于远程的根(不一定是本地驱动器的根)。如果它不是以/ 开头那么它从路径的末尾开始匹配,但它只匹配一个完整的路径元素:

file.jpg  - matches "file.jpg"
          - matches "directory/file.jpg"
          - doesn't match "afile.jpg"
          - doesn't match "directory/afile.jpg"
/file.jpg - matches "file.jpg" in the root directory of the remote
          - doesn't match "afile.jpg"
          - doesn't match "directory/file.jpg"

重要说明您必须使用/模式,\即使在Windows上运行也不行。

*匹配任何东西但不匹配/。

*.jpg  - matches "file.jpg"
       - matches "directory/file.jpg"
       - doesn't match "file.jpg/something"

使用**匹配任何东西,包括斜杠(/)。

dir/** - matches "dir/file.jpg"
       - matches "dir/dir1/dir2/file.jpg"
       - doesn't match "directory/file.jpg"
       - doesn't match "adir/file.jpg"

?匹配除斜杠之外的任何字符。

l?ss  - matches "less"
      - matches "lass"
      - doesn't match "floss"

一个[和]共同组成一个单字节的类,如[a-z]或 [aeiou]或[[:alpha:]]。有关这些内容的更多信息,请参阅go regexp文档

h[ae]llo - matches "hello"
         - matches "hallo"
         - doesn't match "hullo"

A {和}定义元素之间的选择。它应该包含一个以逗号分隔的模式列表, 其中任何一种模式都可能匹配。这些模式可以包含通配符。

{one,two}_potato - matches "one_potato"
                 - matches "two_potato"
                 - doesn't match "three_potato"
                 - doesn't match "_potato"

特殊字符可以在它们之前使用 \进行转义。

\*.jpg       - matches "*.jpg"
\\.jpg       - matches "\.jpg"
\[one\].jpg  - matches "[one].jpg"

还要注意的是, rclone 筛选器全局只能在筛选器命令行标志中使用, 而不能在遥控器的规范中使用, 因此
rclone copy "remote:dir*.jpg" /path/to/dir无法使用 – 所需要的是rclone --include "*.jpg" copy remote:dir /path/to/dir

目录

Rclone跟踪可以匹配任何文件模式的目录。

例如,如果添加包含规则

/a/*.jpg

Rclone将合成目录包含规则

/a/

如果你把任何规则以/结尾它只会匹配目录。

目录匹配用于优化目录访问模式 – 您仍必须匹配要匹配的文件。目录匹配不会优化基于存储桶的遥控器(例如s3,swift,google计算存储,b2)上没有目录概念的任何内容。

rsync和rclone模式之间的差异

Rclone实现了bash样式的{a,b,c}全局匹配,rsync没有。

Rclone始终执行通配符匹配, 因此必须始终转义。

如何使用规则

Rclone维护包含规则和排除规则的组合列表。

每个文件都按顺序匹配, 从顶部开始, 与列表中的规则进行匹配, 直到找到匹配项。然后根据规则类型包括或排除该文件。

如果匹配器在对列表中的所有条目进行测试后未能找到匹配项, 则将包含路径。

例如,根据以下规则,+包括,-排除,

- secret*.jpg
+ *.jpg
+ *.png
+ file2.avi
- *

这将包括

  • file1.jpg
  • file3.png
  • file2.avi

这将排除

  • secret17.jpg
  • 非*.jpg和*.png的

在递归到目录条目之前,对目录条目执行类似的过程。这仅适用于具有目录概念的远程(例如本地,谷歌驱动器,onedrive,亚马逊驱动器)而不是基于桶的远程(例如s3,swift,google compute storage,b2)。

添加过滤规则

使用以下命令行标志添加过滤规则。

重复选项

您可以重复以下选项以添加该类型的多个规则。

  • --include
  • --include-from
  • --exclude
  • --exclude-from
  • --filter
  • --filter-from

重要您不应该–include*与–exclude*一起使用。它可能会产生与您预期不同的结果。在这种情况下尝试使用:–filter*。

请注意,相同类型的所有选项将按上述顺序一起处理,无论它们在命令行上的放置顺序如何。

因此,所有–include选项首先按照它们在命令行中出现的顺序进行处理,然后是所有–include-from选项等。

要混合顺序使用包含和排除,–filter可以使用该标志。

–exclude – 排除匹配模式的文件

添加单个排除规则--exclude该标志可以重复。请参阅上面的处理标志的顺序。

例如--exclude *.bak,从同步中排除所有bak文件。

–exclude-from – 从文件中读取排除模式

从文件中添加排除规则。

该标志可以重复。请参阅上面的处理标志的顺序。

准备这样的文件 exclude-file.txt

# a sample exclude rule file
*.bak
file2.jpg

然后用作--exclude-from exclude-file.txt。这将同步所有文件,除了那些以bak结束的和file2.jpg。

如果你有很多规则,这很有用。

–include – 包括匹配模式的文件

添加单个包含规则--include该标志可以重复。请参阅上面的处理标志的顺序。

例如,–include *.{png,jpg}包括所有png与jpg的文件备份,并没有其他的。

这会–exclude *在过滤器列表的最后添加一个隐含的内容。这意味着你可以混合–include和–include-from与其他过滤器(如–exclude),但你必须包括所有您在包含语句所需的文件。如果这没有提供足够的灵活性,那么你必须使用–filter-from。

–include-from – 读取包含文件中的模式

从文件添加包含规则。

该标志可以重复。请参阅上面的处理标志的顺序。

准备这样的文件 include-file.txt

# a sample include rule file
*.jpg
*.png
file2.avi

然后用作–include-from include-file.txt。这将同步所有 jpg,png文件和file2.avi。

如果你有很多规则,这很有用。

这会–exclude *在过滤器列表的最后添加一个隐含的内容。这意味着你可以混合–include和–include-from与其他过滤器(如–exclude),但你必须包括所有您在包含语句所需的文件。如果这没有提供足够的灵活性,那么你必须使用–filter-from。

–filter – 添加文件过滤规则

这可用于添加单个包含或排除规则。包含规则+开头的以及-开头的排除规则。调用的特殊规则!可用于清除现有规则。

该标志可以重复。请参阅上面的处理标志的顺序。

例如–filter “- *.bak”,从同步中排除所有bak文件。

–filter-from – 从文件中读取过滤模式

从文件添加包含/排除规则。

该标志可以重复。请参阅上面的处理标志的顺序。

准备这样的文件 filter-file.txt

# a sample filter rule file
- secret*.jpg
+ *.jpg
+ *.png
+ file2.avi
- /dir/Trash/**
+ /dir/**
# exclude everything else
- *

然后用作–filter-from filter-file.txt。规则按照定义的顺序处理。

此示例将包括所有jpg和png文件,包含file2.avi的文件,排除任何匹配secret*.jpg。它还将包括dir同步根目录中的所有内容,除了dir/Trash它将被排除。其他所有内容都将从同步中排除。

–files-from – 阅读源文件名列表

这将从传入的文件中读取文件名列表,并 传输这些文件。该过滤规则将被忽略 ,如果你使用这个选项完全。

可以重复此选项以从多个文件中读取。这些按照它们放置在命令行上的顺序读取。

--files-from文件中的路径将被解释为从命令中指定的根开始。前面的/字符被忽略。

例如,假设您有files-from.txt此内容:

# comment
file1.jpg
subdir/file2.jpg

然后你可以像这样使用它:

rclone copy --files-from files-from.txt /home/me/pics remote:pics

这将仅传输这些文件(如果存在)

/home/me/pics/file1.jpg        → remote:pics/file1.jpg
/home/me/pics/subdir/file2.jpg → remote:pics/subdirfile1.jpg

举一个更复杂的例子,假设你有几个文件要用这些绝对路径定期备份:

/home/user1/important
/home/user1/dir/file
/home/user2/stuff

要复制这些,你会发现一个共同的子目录 – 在这种情况下/home ,将其余文件放入files-from.txt或不带前面的/,例如

user1/important
user1/dir/file
user2/stuff

然后,您可以将这些复制到这样的远程

rclone copy --files-from files-from.txt /home remote:backup

3个文件将以如下所示remote:backup的路径 到达files-from.txt:

/home/user1/important → remote:backup/user1/important
/home/user1/dir/file  → remote:backup/user1/dir/file
/home/user2/stuff     → remote:backup/stuff

您当然可以选择/作为根,在这种情况下您 files-from.txt可能会看起来像这样。

/home/user1/important
/home/user1/dir/file
/home/user2/stuff

你会像这样转移它

rclone copy --files-from files-from.txt / remote:backup

在这种情况下home在远程上会有一个额外的目录:

/home/user1/important → remote:home/backup/user1/important
/home/user1/dir/file  → remote:home/backup/user1/dir/file
/home/user2/stuff     → remote:home/backup/stuff

–min-size – 不要传输任何小于此的文件

此选项控制将传输的最小大小文件。这将默认为kBytes但后缀k,M或G可以使用。

例如,--min-size 50k意味着不会传输小于50kByte的文件。

–max-size – 不要传输任何大于此的文件

此选项控制将传输的最大文件大小。这将默认为kBytes但后缀k,M或G可以使用。

例如,--max-size 1G意味着不会传输大于1GByte的文件。

–max-age – 不要传输任何早于此的文件

此选项控制要传输的文件的最长期限。在几秒钟内或后缀为:

  • ms – 毫秒
  • s – 秒
  • m – 分钟
  • h – 小时
  • d – 天
  • w – 周
  • M – 几个月
  • y – 年

例如,--max-age 2d意味着不会传输超过2天的文件。

–min-age – 不要转移任何比这更年轻的文件

此选项控制要传输的文件的最小年龄。用秒或后缀给出(参见–max-age后缀列表)

例如,--min-age 2d意味着不会转移不到2天的文件。

–delete-excluded – 删除从同步中排除的目标文件

重要的是这个标志是危险的 – 使用–dry-run和-v来尝试一下先。

执行rclone sync此操作时,将删除目标上同步中排除的所有文件。

例如,如果你从没有同步A到B无–min-size 50k标志

rclone sync A: B:

然后你用这个重复它 --delete-excluded

rclone --min-size 50k --delete-excluded sync A: B:

这将删除所有B小于50 kBytes的文件,因为这些文件现在已从同步中排除。

在使用此标志之前始终先用–dry-run和-v测试。

–dump filters – 将过滤器转储到输出

这会将定义的过滤器作为正则表达式转储到输出。

用于调试。

引用shell元字符

上面的示例可能无法在shell中逐字处理,因为它们中包含shell元字符(例如*),并且可能需要引用。

例如linux,OSX

  • --include \*.jpg
  • --include '*.jpg'
  • --include='*.jpg'

在Windows中,扩展是由命令而不是shell完成的,所以这应该可以正常工作

  • --include *.jpg

根据文件排除目录

可以基于该目录中存在的文件排除目录。应使用--exclude-if-present标志指定文件名 。该标志优先于其他过滤标志。

想象一下,您有以下目录结构:

dir1/file1
dir1/dir2/file2
dir1/dir2/dir3/file3
dir1/dir2/dir3/.ignore

您可以通过运行以下命令从同步中排除dir3:

rclone sync --exclude-if-present .ignore dir1 remote:backup

目前只支持一个文件名,即–exclude-if-present 不应多次使用。

发表回复 2

Your email address will not be published. Required fields are marked *


wellsyue

wellsyue

–exclude from test.txt
test.txt如果有中文的文件名,就不起作用了,规则无效,
请教如何解决

5iidc

5iidc

建议先在论坛查找答案,例如https://forum.rclone.org/search?q=chinese
或者提交一个issue到github。
直观判断可能是utf-8设置相关的问题