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

Rub*_*lli 1 shell zsh

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

ls ^(*.c|*.md)
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*itt 11

    \n
  1. 在 Zsh 中,^是一个全局运算符EXTENDED_GLOB,当设置时可用,匹配除以下模式之外的任何内容。

    \n
  2. \n
  3. 括号将模式分组;这对于析取 ( |) 非常有用,其中需要括号,以便析取\xe2\x80\x99t 不会被解释为管道。

    \n
  4. \n
  5. ^(*.c||*.md)表示 \xe2\x80\x9canything,除了匹配 的文件*.c、或名称为空的文件、或匹配*.md\xe2\x80\x9d 的文件;空名称是没有用的,所以你应该使用|. 您也可以编写它^*.(c|md)以避免重复*.

    \n
  6. \n
\n

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

\n

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

\n
ls -ld -- ^*.(md|c)\nprint -rC1 -- ^*.(md|c)(N)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n