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
./π