rclone过滤、筛选配置

1,847次阅读
没有评论

共计 786 个字符,预计需要花费 2 分钟才能阅读完成。


versionIntroduced: "v1.22"

筛选,包括和不包括

过滤标志决定rclonesync, move, ls, lsl, md5sum, sha1sum, size, delete, check和类似命令适用于哪些文件。

它们被指定为路径/文件名模式;路径/文件列表;文件年龄和大小,或文件在目录中的存在。基于Bucket的远程没有目录的概念,以类似的方式对对象的键、年龄和大小进行过滤。

Rclone purge不服从过滤器。

要测试过滤器而不损害数据的风险,请将它们应用于rclone ls,或者使用--dry-run-vv标志。

Rclone的过滤器模式只能用在过滤器的命令行选项中,不能用在远程规范中。

例如,rclone copy "remote:dir*.jpg" /path/to/dir没有过滤效果,rclone copy remote:dir /path/to/dir --include "*.jpg"有过滤效果。

重要的是避免在rclone命令中混合任何两个"–包括…"、"排除… "或 "过滤… "标志。其结果可能不是你所期望的那样。相反,使用`–过滤器…’标志。

匹配路径/文件名的模式

Pattern syntax {#patterns}

这里是模式语法的正式定义,例子如下。

Rclone的匹配规则遵循glob风格。

*         匹配任何非分隔符(/)的序列
**        匹配任何序列的字符,包括/分隔符
?         匹配任何一个非分隔符(/)的字符
[ [ ! ] { character-range } ]
          字符类(必须为非空)。
{ pattern-list }
          替代模式
{{ regexp }}
          正则表达式来匹配
c         匹配字符c (c != *, **, ?, \, [, {, })
\c        匹配保留字符c(c = *, **, ?, \, [, {, })或字符类别

性质范围。

c         匹配字符c (c != \, -, ] )
\c        匹配保留字符c(c = `, -, ])。
lo - hi   匹配字符c为lo <= c <= hi

模式-列表。

pattern { , pattern }
          逗号分隔的(没有空格)模式

字符类(见Go regular expression reference)包括。

Named character classes (e.g. [\d], [^\d], [\D], [^\D])
Perl character classes (e.g. \s, \S, \w, \W)
ASCII character classes (e.g. [[:alnum:]], [[:alpha:]], [[:punct:]], [[:xdigit:]])

regexp,供高级用户插入正则表达式 - 更多信息见下文

Any re2 regular expression not containing }}

如果过滤模式以/开头,那么它只在目录树的顶层匹配,相对于远程的root(不一定是驱动器的根)。如果它不是以/开头,那么它从路径/文件名的**端开始匹配,但它只匹配完整的路径元素--它必须从/分隔符或路径/文件的开头开始匹配。

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"

远程的最高级别可能不是驱动器的最高级别。

例如,对于微软视窗的本地目录结构来说

F:
├── bkp
├── data
│   ├── excl
│   │   ├── 123.jpg
│   │   └── 456.jpg
│   ├── incl
│   │   └── document.pdf

要把文件夹data的内容复制到文件夹bkp中,不包括子文件夹excl的内容,下面的命令把F:\dataF:\bkp作为最高级别进行过滤。

rclone copy F:\data\ F:\bkp\ --exclude=/excl/**

重要的是在路径/文件名模式中使用/,而不是``,即使在Microsoft Windows上运行。

简单模式是区分大小写的,除非使用--ignore-case标志。

不使用--ignore-case(默认)

potato - matches "potato"
       - doesn't match "POTATO"

With --ignore-case

potato - matches "potato"
       - matches "POTATO"

在过滤模式中使用正则表达式 {#regexp}

过滤模式的语法是glob风格的匹配(就像bash使用的那样),以方便用户使用。然而这并不能提供对匹配的绝对控制,所以对于高级用户,rclone也提供了一个正则表达式语法。

使用的正则表达式是在 [Go 正则表达式参考] (https://golang.org/pkg/regexp/syntax/) 中定义的。正则表达式应该用 {{ }}括起来。如果glob不以/开头,它们将只匹配最后一个路径段,如果以/`开头,则匹配整个路径名。注意,rclone不会尝试解析所提供的正则表达式,这意味着使用任何正则表达式过滤器都会阻止rclone使用目录过滤规则,因为它将根据所提供的正则表达式检查每个路径。

下面是"{{regexp}}"如何被转化为完整的正则表达式,以匹配整个路径。

{{regexp}}  becomes (^|/)(regexp)$
/{{regexp}} becomes ^(regexp)$

Regexp语法可以与glob语法混合使用,例如

*.{{jpe?g}} to match file.jpg, file.jpeg but not file.png

你也可以使用regexp标志--设置不区分大小写,例如

*.{{(?i)jpg}} to match file.jpg, file.JPG but not file.png

对正则表达式中的通配符要小心--你不希望它们正常匹配路径分隔符。要匹配任何以 "start "开头、以 "end "结尾的文件名,请编写

{{start[^/]*end\.jpg}}

Not

{{start.*end\.jpg}}

这将匹配一个叫做start'的目录,其中有一个叫做end.jpg'的文件,因为.*'将匹配/`字符。

注意,你可以使用-vv --dump filters来显示regexp格式的过滤模式--rclone通过将它们转换为正则表达式来实现glob模式。

过滤模式实例 {#examples}

Description Pattern Matches Does not match
Wildcard *.jpg /file.jpg /file.png
/dir/file.jpg /dir/file.png
Rooted /*.jpg /file.jpg /file.png
/file2.jpg /dir/file.jpg
Alternates *.{jpg,png} /file.jpg /file.gif
/dir/file.png /dir/file.gif
Path Wildcard dir/** /dir/anyfile file.png
/subdir/dir/subsubdir/anyfile /subdir/file.png
Any Char *.t?t /file.txt /file.qxt
/dir/file.tzt /dir/file.png
Range *.[a-z] /file.a /file.0
/dir/file.b /dir/file.1
Escape *.\?\?\? /file.??? /file.abc
/dir/file.??? /dir/file.def
Class *.\d\d\d /file.012 /file.abc
/dir/file.345 /dir/file.def
Regexp *.{{jpe?g}} /file.jpeg /file.png
/dir/file.jpg /dir/file.jpeeg
Rooted Regexp /{{.*\.jpe?g}} /file.jpeg /file.png
/file.jpg /dir/file.jpg

How filter rules are applied to files {#how-filter-rules-work}

Rclone path/file name filters are made up of one or more of the following flags:

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

单个标志可以有一个以上的实例。

Rclone内部使用所有包含和排除规则的组合列表。处理规则的顺序会影响过滤器的结果。

所有相同类型的标志都按上述顺序一起处理,不管不同类型的标志在命令行中的顺序如何。

同一标志的多个实例会根据它们在命令行中的位置从左到右进行处理。
要混合处理包括和排除的顺序,请使用--过滤...标志。

---包含---来自---排除---来自---过滤---来自标志下,规则从上到下处理被引用的文件。

如果有一个"---包括 "或"---来自 "的标志,rclone会暗示一个"- **"规则,并将其添加到内部规则列表的底部。用--filter...标志指定一个+规则并不意味着该规则。

每个通过rclone的路径/文件名都会与综合过滤器列表进行匹配。在第一次与规则匹配时,路径/文件名被包括或排除,不再处理该路径/文件的其他过滤规则。

如果rclone没有找到匹配的规则,在与所有规则(包括适当的隐含规则)进行测试后,该路径/文件名被包括在内。

在这个阶段包含的任何路径/文件都由rclone命令处理。

--files-from'和--files-from-raw'标志优先于其他过滤选项,不能与其他过滤选项结合。

要查看一个命令的内部组合规则列表,以正则表达式的形式,添加--dump filters标志。运行带有"--dump filters "和"--vv "标志的rclone命令,会列出内部过滤元素,并显示它们是如何应用于每个源路径/文件的。虽然字符类过滤规则包含字符类,但目前还没有提供直接将正则表达式过滤选项传入rclone的方法。Go regular expression reference

如何将过滤规则应用到目录中 {#directory_filter}

Rclone命令适用于路径/文件名而不是目录。一个目录的全部内容可以通过 "directory/*"模式与过滤器匹配,或者通过 "directory/**"递归。

目录过滤规则是用结尾的/分隔符定义的。

例如,/directory/subdirectory/是一个rclone目录过滤规则。

Rclone命令可以使用目录过滤规则来决定它们是否递归到子目录。这有可能通过避免列出不必要的目录来优化对远程的访问。优化是否可取,取决于具体的过滤规则和源远程内容。

如果任何正则表达式过滤器被使用,那么就不可能进行目录递归优化,因为rclone必须根据提供的正则表达式检查每个路径。

目录递归优化发生在以下任一情况下。

  • 本地、sftp、微软OneDrive和WebDAV不支持 "ListR "基元。Google Drive和大多数桶型存储支持。完整列表

  • 在其他远程(支持 "ListR "的远程),如果rclone命令不是自然递归,并且没有使用 "fast-list "标志运行。ls, lsf -Rsize是自然递归的,但sync, copymove不是。

  • 每当--禁用ListR标志被应用于rclone命令时。

Rclone命令从路径/文件过滤规则中隐含了目录过滤规则。要查看Rclone为某个命令隐含的目录过滤规则,请指定--dump filters标志。

例如,对于一个包含规则

/a/*.jpg

Rclone意味着目录包含规则

/a/

在rclone命令中指定的目录过滤规则可以限制rclone命令的范围,但是路径/文件过滤规则仍然需要被指定。

例如,rclone ls remote: --include /directory/不会匹配任何文件。因为它是一个"--包括 "选项,"排除**"规则是隐含的,"/directory/"模式只是通过忽略该目录以外的一切来优化对远程的访问。

例如:rclone ls remote: --filter-from filter-list.txt有一个文件filter-list.txt

- /dir1/
- /dir2/
+ *.pdf
- **

dir1dir2目录或其子目录中的所有文件都被完全排除在列表之外。只有remote:根目录或其子目录中后缀为pdf的文件被列出。 - **规则防止列出任何先前未被上述规则匹配的路径/文件。

选项exclude-if-present根据文件在目录中的存在创建一个目录排除规则,并优先于其他rclone目录过滤规则。

当使用模式列表语法时,如果一个模式项包含/**,那么rclone将不能从这个模式列表中暗示一个目录过滤规则。

例如,对于一个包含规则

{dir1/**,dir2/**}

Rclone将只匹配dir1dir2目录下的文件,但不能使用这个过滤器来排除dir3目录的遍历。

目录递归的优化可能会影响性能,但通常不会影响结果。一个例外是使用选项--创建空的源目录的同步操作,任何被遍历的空目录都会被创建。以上面的模式列表{dir1/**,dir2/**}为例,这将在目的地创建一个空目录dir3(当它在源文件中存在时)。把过滤器改为{dir1,dir2}/,或者把它分成两条包含规则--包含dir1/ --包含dir2/**,将匹配同样的文件,同时也过滤目录,结果是不再创建空目录dir3`。

--exclude - 排除与模式匹配的文件

根据单一的排除规则,从rclone命令中排除路径/文件名。

这个标志可以重复使用。关于过滤标志的处理顺序,见上文。

--exclude不应该与--include, --include-from, --filter--filter-from标记一起使用。

--排除'与--files-from'或`--files-from-raw'标记结合使用时,没有效果。

例如:rclone ls remote: --exclude *.bak 将所有.bak文件排除在列表之外。

例如:rclone size remote:"--exclude /dir/**"返回remote:上所有文件的总大小,不包括根目录dir和子目录的文件。

例如,在Microsoft Windows上rclone ls remote: --exclude "*\[{JP,KR,HK}\]*"列出了remote:中名称中含有[JP][KR][HK]的文件。引号防止shell解释[]字符。[]字符转义,所以rclone过滤器会按字面意思处理它们,而不是作为一个字符范围。{}定义了一个rclone模式列表。对于其他操作系统需要单引号,即 "rclone ls remote: --exclude '[{JP,KR,HK}]'"。

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

根据命名文件中的规则,从rclone命令中排除路径/文件名。该文件包含一个注释和模式规则的列表。

对于一个例子 exclud-file.txt:

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

rclone ls remote: --exclud-from exclud-file.txt列出了remote:上的文件,除了那些名为file2.jpg或者后缀为.bak的文件。这相当于rclone ls remote: --exclude file2.jpg --exclude "*.bak"

这个标志可以重复使用。关于过滤标志的处理顺序见上文。

--exclude-from标志在一个rclone命令中应用了多个排除过滤规则时很有用。

--exclude-from不应该与--include, --include-from, --filter--filter-from标志一起使用。

--exclude-from后面跟着-从标准输入读取过滤规则。

--include - 包括与模式匹配的文件

在rclone命令中添加一个基于路径/文件名的单一包含规则。

这个标志可以重复使用。关于过滤标志的处理顺序见上文。

--include--files-from--files-from-raw标志结合使用时没有效果。

--include意味着--exclude **在rclone内部过滤器列表的最后。因此,如果你将--include--include-from标记与--exclude--exclude-from--filter--filter-from混合使用,你必须在include语句中对所有你想要的文件使用include规则。为了获得更大的灵活性,请使用--filter-from标志。

例如,rclone ls remote: --include "*.{png,jpg}"列出remote:上后缀为.png.jpg的文件。所有其他文件都被排除在外。

例如,多个rclone拷贝命令可以用--include和一个模式列表来组合。

rclone copy /vol1/A remote:A
rclone copy /vol1/B remote:B

相当于。

rclone copy /vol1 remote: --include "{A,B}/**"

例如:rclone ls remote:/wheat --include "??[^[:punct:]]*"列出了remote:目录wheat(以及子目录)中第三个字符不是标点的文件。这个例子使用了一个ASCII字符类

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

根据一个命名文件中的规则,将路径/文件名添加到rclone命令中。该文件包含一个注释和模式规则的列表。

对于一个例子 include-file.txt:

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

rclone ls remote: --include-from include-file.txt列出了remote:上名字为file2.avi或后缀为.jpg的文件。这相当于rclone ls remote: --include file2.avi --include "*.jpg"

这个标志可以重复使用。关于过滤标志的处理顺序见上文。

--include-from标志在一个rclone命令中应用了多个include过滤规则时很有用。

--include-from意味着--exclude **在rclone内部过滤器列表的最后。因此,如果你将--include--include-from标记与--exclude--exclude-from--filter--filter-from混合使用,你必须在include语句中对所有文件使用include规则。为了获得更大的灵活性,请使用--filter-from标志。
--exclude-from--files-from--files-from-raw标志结合使用时没有效果。

--exclude-from后面跟着-从标准输入读取过滤规则。

--filter - 添加一个文件过滤规则

根据单一的包含或排除规则,以+-格式为rclone命令指定路径/文件名。

这个标志可以重复使用。关于过滤标志的处理顺序,见上文。

--filter +--include不同。在"---包括 "的情况下,rclone会暗示一个"---排除*"规则,并将其添加到内部规则列表的底部。--filter...+并不意味着该规则。

--filter'与--files-from'或`--files-from-raw'标志结合使用时,没有任何效果。

--filter不应该与--include, --include-from, --exclude--exclud-from标记一起使用。

例如:rclone ls remote: --filter "- *.bak"remote:的列表中排除所有.bak文件。

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

根据命名文件中的规则,将路径/文件名添加到rclone命令中。该文件包含一个注释和模式规则的列表。包含的规则以+开始,排除的规则以-开始。清除现有规则。规则按照它们被定义的顺序进行处理。

这个标志可以重复使用。关于过滤器标志的处理顺序,见上文。

排列过滤规则的顺序,先是最严格的,然后往下排。

例如,对于filter-file.txt

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

rclone ls remote: --filter-from filter-file.txt列出了remote:上的路径/文件,包括所有jpgpng文件,排除任何匹配的secret*.jpg,包括file2.avi。 它还包括remote根目录下dir中的所有文件,除了remote:dir/Trash被排除在外。 其他的都被排除了。

例如,对于另一个 "过滤器-文件.txt"。

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

文件file1.jpgfile3.pngfile2.avi被列出,而secret17.jpg和没有后缀.jpg.png`的文件被排除。

例如,对于另一个 "过滤器-文件.txt"。

+ *.jpg
+ *.gif
!
+ 42.doc
- *

只有文件42.doc被列出。之前的规则被清除。

--files-from - 读取源文件名的列表

将路径/文件从命名文件的列表中添加到rclone命令中。 Rclone按照列表中的顺序处理路径/文件名,而不处理其他。

当使用--files-from时,其他过滤标志(--include--include-from--exclude--exclude-from--filter--filter-from)被忽略。

--files-from'希望有一个文件列表作为其输入。输入行中的前导或尾部的空白将被删除。以#;`开头的行被忽略。

带有--files-from标志的Rclone命令会遍历远程,将--files-from中的名字视为一组过滤器。

如果--no-traverse--files-from标志同时使用,rclone命令就不会遍历远程。相反,它单独处理文件中的每个路径/文件名。对于每个路径/文件名,通常需要调用一次API。这对于一个简短的--files-from列表和一个包含许多文件的远程来说是有效的。

如果--files-from文件中的任何名字在源远程中丢失,Rclone命令不会出错。

--files-from标志可以在一条rclone命令中重复使用,以便从多个文件中读取路径/文件名。文件是沿着命令行从左到右读取的。

--files-from文件中的路径被解释为从rclone命令中指定的根开始。 前面的"/"分隔符被忽略。如果你需要以原始方式处理输入,请参见--files-from-raw
例如,对于一个文件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/subdir/file2.jpg

例如,复制以下由其绝对路径引用的文件。

/home/user1/42
/home/user1/dir/ford
/home/user2/prefect

首先找到一个共同的子目录--在这里是/home,然后把剩下的文件放在files-from.txt中,可以带或不带引导词/,例如:

user1/42
user1/dir/ford
user2/prefect

然后将这些复制到远程。

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

这三个文件的传输情况如下。

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

另外,如果/被选为根目录,files-from.txt将是。

/home/user1/42
/home/user1/dir/ford
/home/user2/prefect

复制命令将是。

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

然后在远程上会有一个额外的home目录。

/home/user1/42       → remote:backup/home/user1/42
/home/user1/dir/ford → remote:backup/home/user1/dir/ford
/home/user2/prefect  → remote:backup/home/user2/prefect

--files-from-raw - 读取源文件名称的列表,无需任何处理。

这个标志与--files-from相同,只是以原始方式读取输入。带有前导/尾部空白的行,以及以"; "或 "#"开头的行将不经任何处理被读取。rclone lsf有一个兼容的格式,可以用来从远程导出文件列表,输入到--files-from-raw

--ignore-case--使搜索不区分大小写

默认情况下,rclone过滤模式是区分大小写的。--ignore-case标志使命令行中的所有过滤器模式不区分大小写。

例如,--include "zaphod.txt"并不匹配Zaphod.txt文件。有了--ignore-case,就可以进行匹配了。

引述shell元字符

含有shell元字符的Rclone命令在你的shell中可能不会像预期的那样工作,可能需要引号。

例如,linux, OSX (*元字符)

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

Microsoft Windows的扩展是由命令完成的,而不是shell,所以--include *.jpg不需要引号。

如果rclone出现错误
Command .... needs .... arguments maximum: you provided .... non flag arguments:
遇到这种情况,原因通常是在远程或标志值的名称中出现了空格。修复方法是引用含有空格的值。

其他过滤器

--min-size - 不要传输任何小于这个大小的文件

控制rclone命令范围内的最小文件大小。 默认单位是 "KiB",但缩写 "K"、"M"、"G"、"T "或 "P "也有效。

例如:rclone ls remote: --min-size 50k列出remote:上的50 KiB或更大的文件。

更多信息见尺寸选项文档

--max-size - 不要传输任何大于这个大小的文件

控制rclone命令范围内的最大文件大小。 默认单位是 "KiB",但缩写 "K"、"M"、"G"、"T "或 "P "都有效。

例如,rclone ls remote: --max-size 1G列出了remote:上的1 GiB大小或更小的文件。

更多信息见大小选项文档

--max-age - 不要传输任何超过此年龄的文件

控制rclone命令范围内的文件的最大年龄。

--max-age只适用于文件,不适用于目录。

例如:rclone ls remote: --max-age 2d列出remote:上2天以内的文件。

有效的格式见时间选项文档

--min-age - 不要传输任何比这小的文件

控制rclone命令范围内文件的最小年龄。 (见--max-age的有效格式)

--min-age只适用于文件,不适用于目录。

例如:rclone ls remote: --min-age 2d列出remote:上2天以上的文件。

关于有效的格式,请参见时间选项文档

其他标志

--delete-excluded - 删除不在同步范围内的目的地的文件。

重要的是这个标志对你的数据是危险的--首先与--dry-run-v一起使用。

rclone sync一起使用,--delete-excluded会删除目的地上被排除在命令之外的任何文件。

例如,rclone sync -i A: B:的范围可以被限制。

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

B:上所有小于50 KiB的文件都被删除,因为它们被排除在rclone同步命令之外。

--dump filters - 转储过滤器到输出端

将定义的过滤器以正则表达式格式转储到标准输出。

对调试很有用。

基于一个文件的排除目录

--exclude-if-present标志控制一个目录是否在rclone命令的范围内,取决于其中是否存在一个命名文件。该标志可以重复检查多个文件名,其中任何一个文件名的存在都将排除该目录。

这个标志比其他过滤标志有优先权。

例如,对于下面的目录结构。

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

命令rclone ls --exclude-if-present .ignore dir1并没有列出dir3file3.ignore

元数据过滤器 {#metadata}

元数据过滤器的工作方式与普通的文件名过滤器非常相似,只是它们匹配对象上的元数据

元数据应该被指定为key=value模式。这可以使用普通的过滤器模式正则表达式进行通配符。

例如,如果你希望只列出模式为`100664'的本地文件,你可以这样做。

rclone lsf -M --files-only --metadata-include "mode=100664" .

或者如果你希望显示某个日期的atimemtimebtime的文件。

rclone lsf -M --files-only --metadata-include "[abm]time=2022-12-16*" .

和文件过滤一样,元数据过滤只适用于文件而不是目录。

可以使用这些标志来应用过滤器。

  • --metadata-include - 包括匹配模式的元数据
  • --metadata-include-from - 从文件中读取元数据包括模式(使用-从stdin中读取)。
  • --metadata-exclude - 排除元数据匹配模式
  • --metadata-exclude-from - 从文件中读取元数据排除模式(使用-从stdin中读取)。
  • --metadata-filter - 添加一个元数据过滤规则
  • --metadata-filter-from - 从文件中读取元数据过滤模式(使用 - 从stdin读取)。

每个标志都可以重复使用。参见如何应用过滤规则一节以了解更多细节--这些标志的工作方式与文件名过滤标志相同,但不是文件名模式,而是元数据模式。

常见的陷阱

rclone论坛上最常见的过滤器支持问题是。

  • 不使用相对于远程根的路径
  • 不使用/从远程的根部匹配
  • 不使用**来匹配目录的内容
正文完
 0
rclone中文站
版权声明:本站原创文章,由 rclone中文站 于2023-01-15发表,共计786字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)