web-dev-qa-db-ja.com

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*}

everything under fooexcepttype_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でどのように機能しますか?

19

例外にディレクトリを含める必要があります:print -l foo/*~foo/type_A*またはprint -l foo/*~{foo/type_A*}

必要に応じて、ディレクトリをワイルドカードに置き換えることができます:print -l foo/*~*/type_A*

10
jofel

zshには^ EXTENDED_GLOBがオンの場合のグロブ演算子。それはあなたの述べられた状況にぴったりです:

setopt extendedglob
print -rl foo/^type_A*

これは、「次のパターンに一致するものを除いて、すべてに一致する」ことを意味しますが、その効果は、スラッシュの間のパターンの部分、またはパターンの先頭と最初のスラッシュの間、または(この場合のように)最後のスラッシュの間スラッシュとパターンの終わり。

現在有効になっているzshオプションを表示できます。

setopt

そしてEXTENDED_GLOBを無効にしてください:

unsetopt extendedglob
33
Chris Johnsen