能
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-from
implied -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 RULES
上rsync
可以使用零或一功能。
rsync
似乎使用了 shell 命令行的扩展版本模式匹配(“通配”),这不同于正则表达式匹配。
零或一功能可用于扩展模式匹配一些 shell(extglob
中的选项bash
),但我没有看到任何对此或类似的讨论扩展模式匹配手册页上的功能rsync
。