zsh:从模式中排除文件

zsh:从模式中排除文件

假设我有以下文件:

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else

我认为以下命令

print -l foo/*~{type_B*}

会打印一切在下面foo 除了开头的东西type_B但它不是,而是打印 foo 下的所有内容:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

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

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

答案1

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

setopt extendedglob
print -rl foo/^type_A*

它的意思是“匹配任何内容,除了与以下模式匹配的内容”,但其效果仅限于斜杠之间的模式部分,或模式开头和第一个斜杠之间,或(如本例中)最后一个斜杠之间的部分斜杠和模式的结尾。

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

setopt

并禁用 EXTENDED_GLOB:

unsetopt extendedglob

答案2

您需要将该目录包含到例外中:print -l foo/*~foo/type_A*print -l foo/*~{foo/type_A*}

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

答案3

您还可以将输出通过管道传输grep -v到 inv呃 grep:

# list all filenames in foo not including "type_B"
ls foo/ | grep -v type_B

相关内容