Por que este comando find não retorna nomes de arquivos contendo apenas caracteres não-ASCII?

3

Estou tentando determinar a causa raiz do porque esse comando find não está funcionando; não deve corresponder ao arquivo chamado this_should_not_match abaixo:

$ > find . -type f -name "*[^ -~]*"
./__º╚t
./this_should_not_match
./__╞_u
./__¡VW
./__▀√Z
./__εè_
./__∙Σ_
./__Σ_9
./__Σhm
./__φY_

Meu shell é Bash 3.2

    
por Zaid 08.03.2016 / 15:10

1 resposta

5

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.

    
por 08.03.2016 / 15:27