Você precisa incluir o *
na negação, por exemplo:
ls !(foo*)
Editar (para esclarecer): O padrão de globulação solicitado [estendido] é !(foo*)
. Se usado com o comando compgen
, a chamada seria, por exemplo:
compgen -G "!(foo*)"
Você precisa de cotações para passar o padrão para o comando compgen
unexpanded.
Editar (após a alteração da pergunta): para o seu padrão completo na sua pergunta editada, experimente um dos @(!(foo*)|*bar)
ou @(!(bar*)|*foo)
. (Veja meu comentário abaixo se não é isso que você espera.)