Dica baseada no tópico:
Após o que foi discutido no tópico acima, resolvi publicar esta dica pois tem sido uma coisa muito útil para mim.
Um problema muito frequente acontece quando importamos arquivos de outros sistemas operacionais ou de outras distribuições
GNU/Linux que têm a codificação de caracteres configurada de maneira diferente. Geralmente o conteúdo e o nome dos arquivos ficam todos bagunçados quando há caracteres especiais (acentos, cedilha, etc...)
Mais ou menos assim:
ls
apresentação.ppt cotação.sh documentação.odt funções.sh
Se você não quiser mudar a configuração do seu
locale apenas por causa de meia dúzia de arquivos, há como fazer a conversão. O Windows geralmente usa a codificação
ISO-8859-1 e o GNU/Linux pode usar o que quiser, mas ultimamente
UTF-8 é mais comum.
Para converter o conteúdo em texto dos arquivos você pode usar a ferramenta
iconv, cuja sintaxe é:
iconv -f [codificação de origem] -t [codificação de destino] arquivo > arquivo.new
Para descobrir a codificação de origem pode-se usar a ferramenta
file, exemplo:
file [arquivo]
Exemplo de conversão de ISO-8859-1 para UTF-8:
iconv -f iso-8859-1 -t utf-8 arquivo.txt > arquivo_novo.txt
Uma dica importante é não usar o mesmo nome de arquivo na entrada e na saída, pois assim você vai perder seus dados... Crie um novo arquivo, verifique se está tudo certo e somente depois sobrescreva o arquivo original.
Contudo, o iconv não muda o nome do arquivo, ele apenas faz a conversão do conteúdo dos arquivos ou de stdin... Dessa forma ficamos com o nome do arquivo todo estragado...
Renomeando os arquivos
A maneira mais fácil de consertar o nome dos arquivos é usando a ferramenta
convmv.
Instala-se de acordo com o gerenciador de pacotes de sua distribuição:
# apt-get install convmv
# sbopkg -i convmv
# emerge --ask app-text/convmv
# yum install convmv
# pacman -Sy convmv # Repositório extra
(...)
Ou então pelos fontes
aqui.
Dito isso, mão à obra. Para usar:
convmv -f [codificação de origem] -t [codificação de destino] --notest arquivo
Se quiser apenas testar sem efetivar a mudança rode o comando sem --notest.
Exemplos:
Renomeando todos os arquivos do diretório atual de ISO-8859-1 para UTF-8:
convmv -f iso-8859-1 -t utf-8 --notest *
Renomeando todos os arquivos MP3 da pasta
/home/musicas (incluindo as subpastas usando o find), de ISO-8859-1 para UTF-8:
find /home/musicas -iname *.mp3 -type f -exec convmv -f iso-8859-1 -t utf-8 --notest {} \;
Contudo, se não quiser instalar o convmv, dá pra fazer um malabarismo usando o iconv, laços e pipes:
Renomeando todos os arquivos do diretório atual de ISO-8859-1 para UTF-8:
for i in $(ls -w1 *); do mv "$i" "$(echo $i | iconv -f iso-8859-1 -t utf-8)"; done
Renomeando todos os arquivos MP3 da pasta
/home/musicas (incluindo as subpastas, usando o find), de ISO-8859-1 para UTF-8:
find /home/musicas -iname *.mp3 -type f | while read line; do mv "$line" "$(echo $line | iconv -f iso-8859-1 -t utf-8)"; done
E por fim talvez a dica mais importante, que é deixar todos os sistemas operacionais que você usa com a mesma codificação de caracteres (se possível), para que você não tenha que se preocupar com esse tipo de conversão com frequência.
Abraços, espero ter ajudado.