Shell-Script

zsh:從模式中排除文件

  • September 6, 2018

假設我有以下文件:

|-- 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 下的所有內容: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 中是如何工作的?

您需要將目錄包含在異常中:print -l foo/*~foo/type_A*print -l foo/*~{foo/type_A*}.

如果需要,可以用萬用字元替換目錄: print -l foo/*~*/type_A*

當 EXTENDED_GLOB 打開時, zsh具有^glob 運算符。這似乎非常適合您所說的情況:

setopt extendedglob
print -rl foo/^type_A*

它的意思是“匹配任何東西,除了匹配後面的模式”,但它的效果僅限於斜線之間的模式部分,或者模式的開頭和第一個斜線之間,或者(如本例中)最後一個斜線和模式的結尾。

您可以查看目前啟用的zsh選項:

setopt

並使用以下命令禁用 EXTENDED_GLOB:

unsetopt extendedglob

引用自:https://unix.stackexchange.com/questions/32407