除外パターンでglobを開始

除外パターンでglobを開始

少し調整しよう終わる。私が持っているとしましょう:

$ ls
bar.baz  foo_bar.baz  foo.bar

bazで終わらないすべてのファイルと一致するように完成したい場合:

$ shopt|grep extglob
extglob         on
$ compgen -G "*.!(baz)"
foo.bar

グローブ除外は期待どおりに機能します。しかし、fooで始まらないすべてのファイルが必要な場合:

$ compgen -G "!(foo)*"
bar.baz
foo.bar
foo_bar.baz

すべてのファイルがまだ一致しています。おそらく、これは*まだ一致するように拡張できるからですfoo。除外を使用してから使用するグローバルトリックはありますか*

Janisが指摘したように、fooを除外する必要があり!(foo*)ますが、実際のユースケースでは拡張子も一致する必要があるため、globは通常次の形式でなければなりません!(foo*)*.bar(まだ「foo」プレフィックスを除外することはできません)。

答え1

*否定文に the を含める必要があります。たとえば、次のようになります。

ls !(foo*)

編集(説明):要求された[拡張]ワイルドカードパターンはです!(foo*)。コマンドと共に使用する場合、compgen呼び出しは次のようになります。

compgen -G "!(foo*)"

compgen拡張されていないコマンドにパターンを渡すには引用符が必要です。

編集(質問の変更後):編集質問の完全なパターンを表示するには、または@(!(foo*)|*bar)いずれかを試してください@(!(bar*)|*foo)。 (予想されない場合は、下記のコメントをご覧ください。)

関連情報