Untar nomes de arquivos em uma codificação de caracteres diferente da codificação usada no sistema de arquivos

6

Ocasionalmente, recebo tarballs em que os nomes dos arquivos são codificados em ISO-8859-1 ou em outro esquema pré-Unicode. Meu sistema usa UTF-8, então quando eu descompactar esses arquivos com as opções usuais ( tar xvf foo.tar ) acabo com um diretório cheio de nomes de arquivos mojibake.

Até agora eu tenho usado convmv para converter os nomes de arquivos para UTF-8 depois eles foram extraídos. Isso é um pouco incoveniente, porque eu preciso invocar convmv em cada arquivo afetado, ou então descompactar o arquivo em um novo diretório, executar convmv em todo o diretório e, em seguida, mover os arquivos para onde eu queria originalmente . Falta de codificar esta funcionalidade em um script de shell, existe alguma maneira de converter os nomes de arquivos arquivados para UTF-8 na mosca, como eles estão sendo untarred?

    
por Psychonaut 08.09.2015 / 11:54

1 resposta

9

Aqui está um pequeno extrator de arquivo tar que modifica os nomes na memória antes de extrair:

#!/usr/bin/python27

import tarfile

def transform(data):
    u = data.decode('latin1')
    return u.encode('utf8')

tar = tarfile.open('archive.tar')
for m in tar.getmembers():
    m.name = transform(m.name)

tar.extractall()

Aviso: ao contrário do GNU tar , esse extrator não está excluindo / . Adicione lógica de verificação a este extrator ou verifique cada arquivo tar antes de extrair com tar -t .

    
por 08.09.2015 / 16:18