Este é um problema localidade . Em sua localidade, [A-Z] se expande para algo como [AbBcZ...zZ] (mais provavelmente outros como caracteres acentuados), portanto [^A-Z] significa "arquivos que terminam com a " no seu exemplo (e apenas no seu exemplo). / p>
Se você quiser evitar essa surpresa, uma maneira é definir LC_COLLATE=C , pois o agrupamento é a parte das configurações de localidade que é responsável pela ordem de classificação. Além disso, esvazie LC_ALL se estiver definido, pois isso teria precedência.
$ ls [a-z]*[^A-Z]
aa ha
$ ( LC_ALL=; LC_COLLATE=C; ls [a-z]*[^A-Z] )
a123e aa ah ha hh
Ou, melhor, é provavelmente preferível não alterar as configurações de localidade e usar as classes apropriadas: [:lower:] em vez de [a-z] e [:upper:] em vez de [A-Z] .
$ ls [[:lower:]]*[^[:upper:]]
a123e aa ah ha hh
Ou use a opção globasciiranges do bash:
$ shopt -s globasciiranges
$ ls [a-z]*[^A-Z]
a123e aa ah ha hh
$ shopt -u globasciiranges
$ ls [a-z]*[^A-Z]
aa ha