Você pode tentar unzip -p file.zip archivedfilename.ext > newfilename.ext
?
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'.
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.
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/*
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.)