Comece um glob com um padrão de exclusão

1

Estou tentando ajustar a conclusão . Suponha que eu tenha:

$ ls
bar.baz  foo_bar.baz  foo.bar

Se eu quiser que a conclusão combine todos os arquivos que não terminam em baz:

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

A exclusão de glob funciona como esperado. Mas se eu quero todos os arquivos que não começam com foo:

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

Todos os arquivos ainda correspondem. Presumivelmente, isso ocorre porque o * ainda pode se expandir para corresponder a foo . Existe algum truque para usar a exclusão seguido por * ?

Como Janis apontou, excluir foo precisa ser !(foo*) , mas o caso de uso real também deve corresponder a uma extensão, portanto, o glob precisa estar geralmente no formato !(foo*)*.bar (que ainda não foi excluído " foo "prefixos).

    
por jake 16.03.2015 / 22:09

1 resposta

4

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.)

    
por 16.03.2015 / 22:18