Supondo que "estrangeiro" significa "não um caractere ASCII", você pode usar find
com um padrão para encontrar todos os arquivos que não possuem caracteres ASCII imprimíveis em seus nomes:
LC_ALL=C find . -name '*[! -~]*'
(O espaço é o primeiro caractere imprimível listado em http://www.asciitable.com/ , ~
é o último.)
A dica para LC_ALL=C
é necessária (na verdade, LC_CTYPE=C
e LC_COLLATE=C
), caso contrário, o intervalo de caracteres é interpretado incorretamente. Veja também a página do manual glob(7)
. Como as LC_ALL=C
causas find
interpretam as strings como ASCII, ele imprime caracteres de vários bytes (como π
) como pontos de interrogação. Para corrigir isso, cat
direcione para algum programa (por exemplo ) ou redirecione para o arquivo.
Em vez de especificar intervalos de caracteres, [:print:]
também pode ser usado para selecionar "caracteres imprimíveis". Certifique-se de definir o código de idioma C ou você terá um comportamento arbitrário (aparentemente).
Exemplo:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
vezLC_COLLATE=C
disso, pois não faz muito sentido definir LC_COLLATE como C sem definirLC_CTYPE
e garantir que ainda funcione mesmo quando a variável LC_ALL estiver no ambiente.SPC
é possível imprimir , o que dizerTAB
eLF
quais também são normalmente encontrados em arquivos de texto?LC_COLLATE
eLC_CTYPE
, veja também a página defind(1)
manual.Se você traduzir cada nome de arquivo usando
tr -d '[\200-\377]'
e compará-lo com o nome original, os nomes de arquivos com caracteres especiais não serão os mesmos.(O que foi dito acima assumindo que você quer dizer não ASCII com estrangeiros)
fonte
[
e]
na maioria dastr
implementações.[
e]
no meu sistema.[
e]
). obrigado.Você pode usar
tr
para excluir qualquer caractere externo de um nome de arquivo e comparar o resultado com o nome do arquivo original para verificar se ele continha caracteres estrangeiros.fonte
find
saída, use saída / entrada terminada em NUL, como mostrado nesta resposta .A resposta aceita é útil, mas se seus nomes de arquivos já estiverem na codificação especificada em
LANG
/LC_CTYPE
, é melhor fazer:As classes de caracteres são afetadas
LC_CTYPE
, mas o comando acima não usa classes de caracteres, apenas intervalos, portanto,LC_CTYPE
apenas impede que caracteres incomuns sejam substituídos por pontos de interrogação.fonte