É possível renomear arquivos em um arquivo zip antes de extrair?

3

Eu peguei um arquivo zip da web que foi compactado em um sistema onde os nomes de arquivos eram codificados em um formato que meu programa de descompactação não consegue ler. Talvez o sistema de arquivos não suporte esses caracteres estranhos ou o shell. Eu não tenho certeza.

Como eu realmente não me importo com o nome do arquivo, uma solução aceitável seria renomear o arquivo ou gravar o conteúdo em um arquivo com nome diferente do nome especificado no arquivo. Isso é possível com um utilitário zip de linha de comando comum? Se sim, como. Outras sugestões sobre o que pode estar errado (talvez não seja o utilitário zip) também são bem-vindas.

Os sintomas são os seguintes:


$ unzip -l 3688232.zip ; unzip 3688232.zip 
Archive:  3688232.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   107937  10-24-2012 01:00   [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
     6354  10-24-2012 01:00   le.gout.des.autres.(3688232).nfo
---------                     -------
   114291                     2 files
Archive:  3688232.zip
error:  cannot create [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
        Invalid or incomplete multibyte or wide character

$ unzip --help 
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Nota:
Eu não estou particularmente interessado em sugestões envolvendo arquivadores gráficos, porque eu já extraí com sucesso o arquivo usando 'wine WinRAR.exe'.

    
por Ярослав Рахматуллин 24.10.2012 / 01:23

4 respostas

2

Você pode tentar unzip -p file.zip archivedfilename.ext > newfilename.ext ?

    
por 24.10.2012 / 01:36
3

Consegui obter todos os arquivos com o Python:

import zipfile
z = zipfile.ZipFile('file.zip')
for i, f in enumerate(z.filelist):
    f.filename = 'file_{0:03}'.format(i)
    z.extract(f)

Você também obterá alguns arquivos vazios correspondentes às entradas do diretório.

    
por 12.12.2013 / 00:13
0

Em um bug arquivado no unzip , Yannis Tsop (ogiannhs) escreveu em 2010 -05-25: # 12

using 7-zip it can be solved!

eg:

LANG=el_GR.CP737 7z x -oPATH file.zip 
convmv -r --notest -f utf-8 -t CP737 PATH/*
    
por 15.10.2014 / 11:34
0

O pacote GNU Info-Zip inclui um utilitário chamado zipnote que permite editar o arquivo nomes dentro de um arquivo zip, bem como manipular comentários de arquivos ("notas").

zipnote -w file.zip <<<$'@ oldname\n@=newname'

Parece que você precisa saber exatamente o nome antigo; não há suporte a curinga.

Também parece que você só pode renomear um único arquivo de cada vez. Acabei com o seguinte para renomear todos os arquivos em um arquivo:

unzip -Z1 file.zip |
awk '{ printf "file%06i %s\n", NR, $1 }' |
while read -r to from; do
    printf '@ %s\n@=%s\n' "$from" "$to" | zipnote -w file.zip
done

(Observe o truque para imprimir o nome do arquivo regularizado "$to" primeiro no script Awk.)

    
por 22.11.2017 / 11:03