假设我有以下文件:
|-- 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