`^(*.c|*.md)` 是什么意思

`^(*.c|*.md)` 是什么意思

如果这是一个潜在的明显问题,我很抱歉,但我不知道这^()意味着什么

ls ^(*.c|*.md)

在 上zsh,此参数扩展到除*.c*.md文件之外的所有内容。

  1. 什么是^
  2. ()在这种情况下括号是什么意思
  3. 该命令^(*.c||*.md)也有效...我应该使用|or||吗?

答案1

  1. 在 Zsh 中,^是一个全局运算符EXTENDED_GLOB设置后可用,匹配任何内容除了以下模式。

  2. 括号将模式分组;这对于|需要括号的析取 ( ) 非常有用,这样析取就不会被解释为管道。

  3. ^(*.c||*.md)表示“除了匹配的文件*.c、名称为空的文件或匹配的文件之外的任何内容*.md”;空名称是没有用的,所以你应该使用|.您也可以编写它^*.(c|md)以避免重复*.

您还应该使用--选项分隔符 for ,ls否则如果任何文件名以 开头-,它们将被视为选项ls

如果您不打算ls列出由该 glob 扩展生成的那些恰好属于类型的文件的内容目录,您应该使用该-d选项。或者只是使用print内置函数来打印这些文件名;仅对从这些文件获取元数据信息ls之类的选项有用。-l

ls -ld -- ^*.(md|c)
print -rC1 -- ^*.(md|c)(N)

这里的文件名是printed raw on 1 Column。 Nglob 限定符 for 以NULL_GLOB避免在找不到匹配文件时出现错误(并且无法从 中获取输出print)。

相关内容