Assumindo que "foreign" significa "não é um caractere ASCII", você pode usar find
com um padrão para localizar 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 no link , ~
é 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 de manual glob(7)
. Como LC_ALL=C
faz com que find
interprete strings como ASCII, ele imprimirá caracteres de múltiplos bytes (como π
) como pontos de interrogação. Para corrigir isso, canalize para algum programa (por exemplo, cat
) 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 do idioma C ou obter um comportamento bastante (aparentemente) arbitrário.
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
./π