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