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の下にすべてを印刷します: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で例外ワイルドカードはどのように機能しますか?

回答:


10

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

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


ありがとう!2番目のパターンについて、パターンがどのように機能するかを説明しますfoo/*~*/type_A*か?2番目は作業ディレクトリの下のすべてのフォルダに*展開さますか、それとも展開するだけで十分fooですか?
アメリオバスケスレイナ

@roseck(ディレクトリで実行print *~**/*する場合など)非常に高速である/ため、最初に最初のパターンを展開し、次に除外パターンに適合するすべての一致を削除すると仮定します。
ジョフェル

2
@roseck ~は純粋にテキスト形式であり、~拡張前の部分は常にそうであり、その後、削除後の部分は一致します。@jofelより良いテストは、最終的にprint /**/*~*何も印刷されない場合でも、ツリー全体を横断することを観察できることです。
ジル「SO-悪であるのをやめる」

彼はtype_Bを除外し、type_Aは含めたいと思っていました。
systemovich

正解は以下のとおりです
アリンディン

30

^EXTENDED_GLOBがオンの場合、zshにはglob演算子があります。あなたの述べた状況に完璧にフィットするようです:

setopt extendedglob
print -rl foo/^type_A*

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

現在有効になっているzshオプションは次の方法で表示できます。

setopt

そして、EXTENDED_GLOBを無効にします:

unsetopt extendedglob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.