Muitas vezes, ao copiar arquivos de um computador para outro, principalmente via CD, os nomes dos arquivos ficam desajustados, mais especificamente os caracteres acentuadas e a cedilha. Por exemplo, um arquivo "Já Refulge a Glória Eterna.mp3" aparece como "Já Refulge a Glória Eterna.mp3".
Esse problema está relocionado ao charset do sistema de origem e o do seu sistema, que são diferentes. Entretanto, podemos facilmente resolver o problema e, com apenas um único comando, corrigir os nomes de todos os arquivos e diretórios presentes em um diretório qualquer.
Antes de mais nada, temos que saber qual o charset do seu sistema e o dos nomes dos arquivos. Para saber o charset do seu sistema, execute o comando locale. A saída será parecida com essa:
$ locale
LANG=pt_BR
LC_CTYPE="pt_BR"
LC_NUMERIC="pt_BR"
LC_TIME="pt_BR"
LC_COLLATE="pt_BR"
LC_MONETARY="pt_BR"
LC_MESSAGES="pt_BR"
LC_PAPER="pt_BR"
LC_NAME="pt_BR"
LC_ADDRESS="pt_BR"
LC_TELEPHONE="pt_BR"
LC_MEASUREMENT="pt_BR"
LC_IDENTIFICATION="pt_BR"
LC_ALL=pt_BR
O charset padrão do
Linux é o ISO-8859-1 (também conhecido como Latin1). Sendo assim, tanto pt_BR quanto pt_BR.ISO8859-1 são para esse charset. Se, por outro lado, aparecer algo como pt_BR.UTF-8, então o charset do seu sistema é UTF-8.
Agora, vamos verificar o charset dos nomes dos arquivos. Para isso, acesse o diretório onde estão os arquivos e faça o seguinte procedimento:
$ ls -1 > lista
$ file lista
lista: UTF-8 text
Ou seja, o charset dos nomes dos arquivos é UTF-8, enquanto o do sistema é ISO-8859-1. Com essa informação em mãos, basta executar o seguinte comando, para corrigir os nomes dos arquivos:
$ ls -1 | while read arquivo ; do
novo="`echo $arquivo | iconv -f UTF-8 -t ISO-8859-1`"
if [ "$novo" != "$arquivo" ] ; then
mv "$arquivo" "$novo"
fi
done
O segredo está no comando
iconv, que converte o charset, de UTF-8 (-f UTF-8) para ISO-8859-1 (-t ISO-8859-1). Se no seu sistema os charsets forem outros, basta trocar ISO-8859-1 e UTF-8 pelos respectivos charsets.
Agradecimentos especiais ao
Eduardo por ajudar na melhoria dessa dica, indicando uma situação onde ela não se aplicava (vide comentários abaixo).
Abraços,
Davidson