zsh:从模式中排除文件

Ame*_*ina 20 zsh shell-script wildcards

假设我有以下文件:

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else
Run Code Online (Sandbox Code Playgroud)

我认为以下命令

print -l foo/*~{type_B*}
Run Code Online (Sandbox Code Playgroud)

将打印一切foo ,除了东西下手type_B,但它并没有,而是在富打印的一切:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else
Run Code Online (Sandbox Code Playgroud)

我也尝试过print -l foo/*~type_B并得到了同样的东西。

异常通配符~在 zsh 中如何工作?

Chr*_*sen 38

^当 EXTENDED_GLOB 打开时,zsh具有glob 运算符。它似乎非常适合您所述的情况:

setopt extendedglob
print -rl foo/^type_A*
Run Code Online (Sandbox Code Playgroud)

它的意思是“匹配任何东西,除了匹配下面的模式”,但它的影响仅限于斜线之间的模式部分,或者模式的开头和第一个斜线之间,或者(在这种情况下)最后一个斜线之间斜线和模式的结尾。

您可以查看当前启用的zsh选项:

setopt
Run Code Online (Sandbox Code Playgroud)

并禁用 EXTENDED_GLOB :

unsetopt extendedglob
Run Code Online (Sandbox Code Playgroud)


jof*_*fel 12

您需要将该目录包含在异常中:print -l foo/*~foo/type_A*print -l foo/*~{foo/type_A*}.

如果需要,您可以用通配符替换目录: print -l foo/*~*/type_A*

  • @roseck `~` 纯文本,`~` 之前的部分像往常一样扩展,然后剥离后的部分匹配。@jofel 一个更好的测试是 `print /**/*~*`:你可以观察到它遍历了整棵树,即使它最终什么也没打印。 (3认同)