zsh:从模式中排除文件


18

说我有以下文件:

|-- 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/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中如何工作?

Answers:


10

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

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


谢谢!关于第二种模式,您介意解释该模式如何foo/*~*/type_A*工作吗?第二个*扩展到工作目录下的每个文件夹,还是聪明到只能扩展到foo
Amelio Vazquez-Reina

@roseck因为它看起来非常快(例如,当您print *~**/*/目录中运行时),所以我假设它首先扩展第一个模式,然后删除所有适合排除模式的匹配项。
jofel 2012年

2
@roseck ~纯粹是文字上的,~扩展之前的部分会像往常一样扩展,然后剥离后的部分匹配。乔菲尔(Jofel)是一个更好的测试print /**/*~*:即使它最终什么也不打印,您可以观察到它遍历整棵树。
吉尔斯(Gilles)'所以

我以为他想排除type_B但包括type_A。
systemovich

正确的答案是
aryndin

30

zsh^EXTENDED_GLOB启用时, glob运算符。似乎非常适合您陈述的情况:

setopt extendedglob
print -rl foo/^type_A*

它的意思是“匹配任何内容,除了匹配以下模式的内容之外”,但其作用仅限于斜线之间,模式开头与第一个斜线之间(或在这种情况下)之间的模式部分。斜线和图案的结尾。

您可以通过以下方式查看当前启用的zsh选项:

setopt

并使用以下命令禁用EXTENDED_GLOB:

unsetopt extendedglob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.