全球预选赛实际上并不是问题所在。事实上,它们使一些示例起作用。这里有三个独立的问题:如何解析glob限定符、glob运算符的语法以及控制这些限定符的选项。
$zsh-f#使用默认选项开始暗星%lsfoo.bar foo.jpg foo.png foo.txt暗星%echo*。(文本)(.)食品.txt暗星%echo*。(jpg|png)(.)foo.jpg foo.png文件
括号总是被接受用于在glob中进行分组,尽管在某些情况下,在它们成为glob的一部分之前,它们被解析为其他内容(算术表达式、glob限定符(稍后我将详细介绍)、函数定义等)。在*.(文本)(.)
,最后一个带括号的块(.)
被解析为glob限定符、和(文本)
是只匹配精确文本的模式文本
.
模式*.(jpg|png)(.)
使用全局运算符 |
意思是“或”。该部分(jpg|png)
匹配两者jpg格式
和png公司
.
暗星%回波*。(^txt)(.)zsh:未找到匹配项:*。(^txt)(.)暗星%setopt extended_glob暗星%echo*。(^txt)(.)foo.bar foo.jpg foo.png
默认情况下,^文本
只匹配自身。这个全局运算符 ^
仅当选项扩展的全局
已设置。此选项始终在完成功能和zmv公司
,但默认情况下处于禁用状态。默认情况下,它关闭的唯一原因是为了实现严格的向后兼容性(它最初并不存在,但已经存在了30多年)。很少有实际情况会产生影响(主要是如果你想通过#
,^
或~
在命令参数中没有引用它),即使它引用了,反斜杠或任何其他引号也会修复此问题。我建议把setopt扩展glob
在您的.zshrc公司
。启用此选项后,^文本
匹配除之外的任何内容文本
.
暗星%setopt extended_glob暗星%echo*。(^jpg|^png)(.)foo.bar foo.jpg foo.png foo.txt暗星%echo*^(jpg|png)(.)foo.bar foo.jpg foo.png foo.txt
模式(^jpg|^png)
匹配任何不匹配的jpg格式
或者那不是png公司
。任何字符串都不是-jpg或not-png,所以(^jpg|^png)
匹配所有内容。匹配两者都不是的任何内容jpg格式
也不是png公司
,使用^(jpg|png)
如果你想否定的部分后面有更多的内容,你需要两个后面的括号,例如。*.(^(jpg|png)).gz
匹配foo.bar.gz公司
和食品.txt.gz
但不是foo.jpg.gz格式
或foo.png.gz公司
.
现在让我们回到如何glob限定符已分析。默认情况下,末尾带括号的组被解析为全局限定符,除非它包含|
或嵌套括号或~
(当扩展的全局
已启用)。
暗星%echo*.txt文件夹.txt暗星%echo*。(文本)zsh:未找到匹配项:*。(文本)暗星%echo*。((txt))食品.txt暗星%echo*。(文本)(.)文件夹.txt暗星%echo*。(png|jpg)foo.jpg foo.png文件
在*.(文本)
,(文本)
被解析为glob限定符(因此*.(文本)
匹配名称以点结尾、可执行且设置了粘性位的文件)。使用双括号可以避免glob限定符解析。*.(png|jpg)
未解释为使用glob限定符,因为|
.*.(txt)(.)
已经有了(.)
解释为glob限定符,因此(文本)
部分不能是glob限定符。
您可以通过取消设置来禁用glob限定符分析裸全球质量
。我不建议这样做,因为不明确的模式很少见,并且当您确实需要glob限定符时,它需要额外的类型。请注意
暗星%setopt no_bare_glob_qual暗星%setopt no_extended_glob暗星%echo*。(文本)食品.txt暗星%echo*。(文本)(.)zsh:未找到匹配项:*。(文本)(.)暗星%echo*.txt(#q)zsh:未找到匹配项:*.txt(#q)暗星%setopt extended_glob暗星%echo*.txt(#q)foo.txt文件