以下模式将 .pdf 文件从源复制到目标,工作正常。
rsync -rv --include="*.pdf" --include="*/" --exclude="*" --prune-empty-dirs /source/ ~/destination/
但我想排除文件名中包含 web 的文件不起作用,它甚至将文件 web_profile.pdf 文件复制到目的地,为什么会这样。
rsync -rv --include="*.pdf" --include="*/" --exclude="*web*.pdf" --exclude="*" --prune-empty-dirs /source/ ~/destination/
另外,我不清楚排除特定目录**/
(即 2 星和单星)。
有人可以消除我对 rsync 中模式匹配的疑问吗?
--include="*.pdf"
matches *pdf
,如果我想排除某些目录,例如../web-info/..pdf
,我该怎么做?
答案1
--include
和选项的顺序--exclude
是相关的。
您首先要包含所有文件,因此*.pdf
后面的排除永远不会适用。另请注意,包含/排除模式适用于节点名称(文件、目录等),而不适用于路径名,除非模式中*web*.pdf
有/
或;**
所以排除无论如何*web*.pdf
也不会排除...web.../...pdf
。
如果您想要所有 PDF,而不是匹配目录下的 PDF,*web*
那么这应该可行:
rsync -rv --exclude "*web*/" --include="*.pdf" --include="*/" --exclude="*" --prune-empty-dirs /source/ ~/destination/
这将防止 rsync 递归到匹配的目录*web*
,包括所有*.pdf
文件,包括所有其他目录,排除所有其他文件。
**
在模式中使用 a也可能有效,尽管我更喜欢上面的解决方案:
rsync -rv --exclude "**web*.pdf" --include="*.pdf" --include="*/" --exclude="*" --prune-empty-dirs /source/ ~/destination/