rsync --include 可以匹配零个或一个字符吗?

rsync --include 可以匹配零个或一个字符吗?

rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/

简化为类似的东西

rsync -a --include="*.[Jj][PpFf][EIi]?[GgFf]" --exclude="*" tmp/a/* tmp/b/

匹配 .jpg .JFIF .jpeg 如下:

ls tmp/a/*.{J,j}{P,p,F,f}{I,i,E,e,}{G,g,F,f} 2>/dev/null

我创建了一个有效的示例测试,但我想将图像匹配
包含合并到一个 --include 中,而不会有与 foo.jp.png 匹配的危险 --include="*.[Jj][Pp]*[Gg]"(我不想复制它。)

mkdir -p tmp/a; touch tmp/a/foo.jpeg; touch tmp/a/bar.jpg; rm tmp/b/*; rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/ ; ls -la tmp/b

答案1

您最好使用不同的工具来查找文件列表,然后将它们通过管道传输到 rsync 中。例如:

find /tmp/a -iregex '.*\(jpe?g\|jfif\)' | 
rsync -nav --files-from=- / /tmp/b

意味着-iregex忽略大小写。正则表达式模式^在开头和$结尾都有隐含的含义。默认正则表达式类型是emacs,因此需要反斜杠。

-n(我在 rsync 中留下了 a以不复制任何内容)。请注意,使用--files-fromimplied -R,这意味着完整路径,例如tmp/a/t.jpg,将被复制到目的地,这也是我在查找中使用绝对路径的原因,并且作为rsync目录 (/)。这只是为了简化测试,直到您了解需要为查找和 rsync 提供的起始目录。

例如,要删除tmp/a前缀,您可以执行以下操作(cd /tmp/a; find . ... ) | rsync ... /tmp/a /tmp/b。 find 将输出t.jpg,rsync 将在 中找到该文件,并在 中/tmp/a创建文件。t.jpg/tmp/b

答案2

我喜欢@meuh 的回答。这个答案解释了原因喵的回答就是这样做的方法零或一匹配于rsync

rsync根据手册页上的说明,我不相信命令行INCLUDE/EXCLUDE PATTERN RULESrsync可以使用零或一功能。

rsync似乎使用了 shell 命令行的扩展版本模式匹配(“通配”),这不同于正则表达式匹配。

零或一功能可用于扩展模式匹配一些 shell(extglob中的选项bash),但我没有看到任何对此或类似的讨论扩展模式匹配手册页上的功能rsync

相关内容