Seu comando faz algo muito semelhante ao que você deseja: ele é expandido para a lista de nomes de arquivos não exatamente: a
, b
ou c
. Se você testar, você verá:
$ touch a b c d
$ ls *[!abc]*
d
Mas se você criar outro arquivo e testar novamente:
$ touch argh
$ ls *[!abc]*
argh d
Para excluir nomes de arquivos que contenham esses caracteres em qualquer lugar, use:
$ shopt -s extglob
$ ls !(*[abc]*)
d
Outra maneira de fazer isso (novamente com globs estendidos) seria listar explicitamente os padrões:
$ ls !(*a*|*b*|*c*)
d