Os intervalos funcionam apenas de forma confiável e portável na localidade C. Em outras localidades, você obtém alguma variação, mas geralmente [x-y]
obtém os caracteres (na verdade, agrupando elementos, pode até corresponder a sequências de caracteres) que classificam depois de x
e antes de y
em alguma ordem que é frequentemente obscura e nem sempre o mesmo que sort
usaria.
Na localidade C (consulte O que faz “LC_ALL = C”? ), os caracteres são bytes e os intervalos baseiam-se no ponto de código dos caracteres ( em valores de byte).
LC_ALL=C find . -type f -name "*[^ -~]*"
em um sistema baseado em ASCII (a maioria deles; POSIX não garante que o local C use o conjunto de caracteres ASCII, mas na prática, a menos que você esteja em algum SO mainframe IBM baseado em EBCDIC sobre isso), você estará usando ASCII) listaria arquivos regulares cujo nome contém bytes diferentes daqueles entre 32 e 126.
Observe também que em uma localidade de caracteres de múltiplos bytes (como os UTF-8, a norma hoje em dia), o *
pode nem corresponder a todos os nomes de arquivos, pois em alguns sistemas ele não corresponderá a sequências de bytes não formam caracteres válidos.