Corrigindo nomes de arquivos com charset errado
Dica publicada em Linux / Miscelânea
Corrigindo nomes de arquivos com charset errado
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
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
Nota 10