Acho que você vê esse caractere �
inválido porque o nome contém uma sequência de bytes que não é válida UTF-8. Nomes de arquivos em sistemas de arquivos unix típicos (incluindo o seu) são sequências de bytes, e cabe aos aplicativos decidir qual codificação usar. Atualmente, há uma tendência a usar o UTF-8, mas não é universal, especialmente em locais que nunca poderiam viver com ASCII simples e usavam outras codificações desde antes da existência do UTF-8.
Teste LC_CTYPE=en_US.iso88591 ls
para ver se o nome do arquivo faz sentido em ISO-8859-1 (latim-1). Se isso não acontecer, tente outras localidades. Observe que somente a configuração LC_CTYPE
locale é importante aqui.
Em uma localidade UTF-8, o comando a seguir mostrará todos os arquivos cujo nome não é válido UTF-8:
grep-invalid-utf8 () {
perl -l -ne '/^([find | grep-invalid-utf8 | recode latin1..utf8
find | grep-invalid-utf8 | iconv -f latin1 -t utf8
0-7]|[0-7][0-7]|[0-7][0-7]{2}|[0-7][0-7]{3}|[0-3][0-7]{4}|[4-5][0-7]{5})*$/ or print'
}
find | grep-invalid-utf8
Você pode verificar se eles fazem mais sentido em outro local com recode ou < href="http://manpages.ubuntu.com/manpages/lucid/man1/iconv.1.html"> íconev :
find | grep-invalid-utf8 |
rename 'BEGIN {binmode STDIN, ":encoding(latin1)"; use Encode;}
$_=encode("utf8", $_)'
Depois de determinar que vários nomes de arquivos estão em uma determinada codificação (por exemplo, latin1), uma maneira de renomeá-los é
grep-invalid-utf8 () {
perl -l -ne '/^([find | grep-invalid-utf8 | recode latin1..utf8
find | grep-invalid-utf8 | iconv -f latin1 -t utf8
0-7]|[0-7][0-7]|[0-7][0-7]{2}|[0-7][0-7]{3}|[0-3][0-7]{4}|[4-5][0-7]{5})*$/ or print'
}
find | grep-invalid-utf8
Isso usa o comando renomear do perl disponível no Debian e no Ubuntu. Você pode passar -n
para mostrar o que estaria fazendo sem realmente renomear os arquivos.