少し調整しよう終わる。私が持っているとしましょう:
$ 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)
。 (予想されない場合は、下記のコメントをご覧ください。)